【Janet】数据结构

当你有了函数或原始值类型,你可能想知道如何处理它们的集合。Janet 有一些功能强大的核心数据结构。主要的6种内置数据类型是表,结构体,数组,元组,字符串和缓冲区。下表描述了它们之间的关系。

Interface Mutable Immutable
Indexed Array Tuple
Dictionary Table Struct
Bytes Buffer String (Symbol, Keyword)

可索引类型是线性链表,可以通过整数索引在常量时间复杂度内访问。为了快速访问,可索引类型底层使用了一整块内存,且索引从0开始。字典类型将值关联到键,它与索引类型的区别是键不止是整数。字典类型底层使用哈希表实现,同样提供常数时间复杂度的查询和插入(可变类型)。最后 "bytes" 抽象的是任何包含字节序列的类型。它有整数索引和整数值(0-255),因此它更像是数组和元组。字节序列不能包含非整数值。

下表显示了内置数据结构的各种操作的时间复杂度和其他信息。数据结构上的所有基本操作都会在常数时间内运行,无论数据结构中的项目数量有多少。

Data Structure Access Insert/Append Delete Space Complexity Mutable
Array * O(1) O(1) O(1) O(n) Yes
Tuple O(1) - - O(n) No
Table O(1) O(1) O(1) O(n) Yes
Struct O(1) - - O(n) No
Buffer O(1) O(1) O(1) O(n) Yes
String/Keyword/Symbol - - - O(n) No

注意:数组的追加和删除对应的是 array/pusharray/pop。随机删除和插入时间复杂度是 O(n)n 是数组中元素数量。

lisp 复制代码
(def my-tuple (tuple 1 2 3))

(def my-array @(1 2 3))
(def my-array (array 1 2 3))

(def my-struct {
 :key "value"
 :key2 "another"
 1 2
 4 3})

(def another-struct
 (struct :a 1 :b 2))

(def my-table @{
 :a :b
 :c :d
 :A :qwerty})
(def another-table
 (table 1 2 3 4))

(def my-buffer @"thisismutable")
(def my-buffer2 @``This is also mutable``)

读取数据结构中的值使用 getin 函数。第一个参数是数据结构本身,第二个参数是键。可选的第三个参数是当值不存在时的默认值。

lisp 复制代码
(get @{:a 1} :a) # -> 1
(get {:a 1} :a)  # -> 1
(in  {:a 1} :a)  # -> 1
(get @[:a :b :c] 2) # -> :c
(in  @[:a :b :c] 2) # -> :c
(get (tuple "a" "b" "c") 1) # -> "b"
(get @"hello, world" 1) # -> 101
(get "hello, world" 1)  # -> 101
(in  "hello, world" 1)  # -> 101
(get {:a :b} :a)    # -> :b
(get {:a :b} :c :d) # -> :d
(in  {:a :b} :c :d) # -> :d

针对表和结构体的 in 函数(v1.5.0添加)和 get 一样。但是用于数组,元组和字符串类数据结构时,如果索引超出范围就会报错,如果需要检测这类错误,推荐使用 in

lisp 复制代码
(get @[:a :b :c] 3) # -> nil
(in  @[:a :b :c] 3) # -> raises error

使用 put 函数可以修改可变数据结构。它接受3个参数,数据结构,键和值,并返回更新后的数据结构。允许的键和值类型取决于传递的数据结构。

lisp 复制代码
(put @[] 100 :a)
(put @{} :key "value")
(put @"" 100 92)

注意,对于数组和缓冲区,如果写入的索引超过了数组的长度,它们会被扩容,并分别使用 nil 和 0 填充。

最后一个用于所有数据结构的通用函数是 length 函数。它返回数据结构中的元素数量(字典类型中键的数量)。

相关推荐
CoderYanger3 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
萌>__<新4 小时前
力扣打卡每日一题————除自身外所有元素的乘积
数据结构·算法
xu_yule4 小时前
算法基础—搜索(2)【记忆化搜索+BFS+01BFS+Floodfill]
数据结构·算法
Queenie_Charlie5 小时前
数字去重(set)
数据结构·c++·set
Ayanami_Reii6 小时前
区间不同数的个数-树状数组/线段树/莫队/主席树
数据结构·c++·算法·线段树·树状数组·主席树·莫队
CoderYanger7 小时前
C.滑动窗口-求子数组个数-越长越合法——3325. 字符至少出现 K 次的子字符串 I
c语言·数据结构·算法·leetcode·职场和发展·哈希算法·散列表
sin_hielo7 小时前
leetcode 3606
数据结构·算法·leetcode
萌>__<新9 小时前
力扣打卡每日一题————最小覆盖子串
数据结构·算法·leetcode·滑动窗口·哈希表
长安er10 小时前
LeetCode 83/237/82 链表删除问题-盒子模型
数据结构·算法·leetcode·链表·力扣
重生之后端学习11 小时前
56. 合并区间
java·数据结构·后端·算法·leetcode·职场和发展