当前位置: 首页 > news >正文

【Janet】数据结构

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

InterfaceMutableImmutable
IndexedArrayTuple
DictionaryTableStruct
BytesBufferString (Symbol, Keyword)

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

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

Data StructureAccessInsert/AppendDeleteSpace ComplexityMutable
Array *O(1)O(1)O(1)O(n)Yes
TupleO(1)--O(n)No
TableO(1)O(1)O(1)O(n)Yes
StructO(1)--O(n)No
BufferO(1)O(1)O(1)O(n)Yes
String/Keyword/Symbol---O(n)No

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

(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 24 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 函数。第一个参数是数据结构本身,第二个参数是键。可选的第三个参数是当值不存在时的默认值。

(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

(get @[:a :b :c] 3) # -> nil
(in  @[:a :b :c] 3) # -> raises error

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

(put @[] 100 :a)
(put @{} :key "value")
(put @"" 100 92)

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

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

http://www.dtcms.com/a/614540.html

相关文章:

  • Tensor与NumPy转换
  • 06-文件操作-教程
  • 【ros2】ROS2 C++服务端与客户端开发指南
  • 网站开发成本主要有哪些网络广告发布
  • 【035】Dubbo3从0到1系列之dubbo-remoting核心接口Endpoint
  • 用备份的网站代码做网站步骤小程序模板怎么导入
  • 利用帝国cms网站建设网页源代码怎么搜索关键词
  • 【愚公系列】《腾讯元宝从入门到精通》002-提示词设计与优化
  • C++哈希(包含unordered_set和unordered_map的封装)
  • 编译类语言 | 深入了解编译原理及应用
  • 西安建设银行网站专业公司网站 南通
  • 禁止同ip网站查询抖音小程序注册
  • Chaos-nano:Arduino Pro Mini 轻量级操作系统解析与实战应用
  • 从 0 到 1 学爬虫:Python 基础语法在爬虫中的实战运用用这个标题写一篇文章,在当前对话窗口输出
  • 网页设计网站排行榜中国发达国家还有多远
  • Podman和Docker
  • 自己架设服务器做网站一同看网页打不开
  • 手写LRU 缓存
  • 23-MD5+DES+Webpack:考试宝
  • 前端构建工具环境变量,安全管理
  • 个人网站名称举例网站建设需要的硬件
  • 数据分析笔记09:Python条件语循环
  • 可在哪些网站做链接赣州网络招聘
  • 高端网站制作网站背景自动切换
  • 代码生成工具GitHub Copilot介绍
  • RDMA基本操作类型---send/recv,write/read
  • 2.37基于Multisim的数字电子钟准点报时,时间可调,Multisim时钟,Multisim电子时钟。含3000字报告。功能:带准点报时,时间可调
  • 建筑模板有哪些seo优化按天扣费
  • 广州网站设计联系方式旅游做攻略用什么网站好
  • 小华HC32L136K8TA 单片机新建 MDK5 工程模板 (一)