Zig标准库:最全数据结构深度解析(2)

1.1 queue structures

LinearFifo:缓冲区是FIFO内部的一个组成部分,其大小按照指定的尺寸设定。初始化时,这个缓冲区是以切片的形式传递给初始化函数的。为了动态管理缓冲区,使用了一个名为mem.Allocator的内存分配器。

fifo.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/fifo.zig.htmlPriorityDequeue:用于存储泛型数据的优先级双端队列。使用init进行初始化。提供compareFn函数,当其第二个参数应比第三个参数更早被最小化弹出时返回Order.lt;如果参数具有相等的优先级,则返回Order.eq;如果第三个参数应排在第二个参数之后被最小化弹出,则返回Order.gt。最大元素的弹出操作则相反。priority_dequeue.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/priority_dequeue.zig.htmlPriorityQueue:用于存储泛型数据的优先级队列。初始化时使用init。需要提供compareFn函数,该函数在其第二个参数应当比第三个参数先被弹出时返回Order.lt,在两个参数优先级相同时返回Order.eq,而在第三个参数应当被最先弹出时返回Order.gt

priority_queue.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/priority_queue.zig.html

1.2 BitStack

这是一个具有类似栈操作方法(如 push() 和 pop())的比特位的 ArrayList。本质上是一个比特位的数组列表,但加入了栈的基本功能,允许在列表的一端高效地添加(push)和移除(pop)元素。这种数据结构结合了数组列表的动态扩展能力和栈的后进先出(LIFO)特性,适用于需要快速访问和修改数据末端的应用场景。

BitStack.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/BitStack.zig.html

1.3 RingBuffer

这个环形缓冲区在存储读写索引的同时,能通过将索引按模运算增加至两倍于切片长度,以及在访问切片时将索引按切片长度取模,从而充分利用整个底层数组的空间。这意味着,通过观察读写索引之间的差值,就能判断环形缓冲区是否已满或为空,而无需额外的布尔标志或预留缓冲区中的一个槽位。

值得注意的是,这个环形缓冲区的设计并没有考虑线程安全问题,因此不应假定它适用于涉及独立读写线程的场景。

RingBuffer.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/RingBuffer.zig.html

1.4 SinglyLinkedList

单链表由一个前向指针统领。为了最小化空间占用和指针操作开销,元素以单向链接的方式组织,但这牺牲了对于任意元素删除的效率,使其变为O(n)级别。新元素可以被添加到现有元素之后或链表头部。单链表只能从前向后进行遍历。单链表非常适合处理大数据集且元素删除操作较少或几乎不发生的情况,或是用于实现后进先出(LIFO)队列。 

linked_list.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/linked_list.zig.html

1.5 Treap 自平衡二叉搜索树

Treap和随机化二叉搜索树是两种紧密相关的二叉搜索树数据结构形式,它们维护一组动态的有序键集合,并允许在这些键中进行二分查找。经过任意序列的键插入和删除操作后,树的形态成为一个随机变量,其概率分布与随机二叉树相同;具体而言,以极高的概率,树的高度与键数量的对数成比例,这意味着每次查找、插入或删除操作的时间复杂度为对数级别。

treap.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/treap.zig.html

1.6 PackedIntIo

一组数组和切片类型,它们将整数元素以位的方式紧密封装。一个普通的 [12]u3 占用 12 字节的内存空间,因为 u3 的对齐方式是 1。而 PackedArray(u3, 12) 只占用 4 字节的内存,因为它通过位封装技术将整数元素紧密存储在一起,极大地节省了空间。

packed_int_array.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/packed_int_array.zig.html

1.7 BitSet 

位集是一种存储已知最大值整数集合的数据结构,其中每个整数仅占用一位。位集具备快速的存在性检查、更新操作以及并集和交集运算。然而,当潜在的项数目非常大,而特定集合中实际存在的项数目通常较少时,位集可能不如数组集合在内存效率上表现优秀。

以下是定义的五种子类型:

  • IntegerBitSet:具有静态大小的位集,由一个整数支撑。这种集合适合小规模的集合,但对于较大规模的集合,尤其是在调试模式下,可能会生成效率较低的代码。

  • ArrayBitSet:具有静态大小的位集,由一个usize数组支撑。这种集合适合较大规模的集合,但如果集合规模较小,它可能会使用多余的空间。

  • StaticBitSet:根据请求的大小,自动选择IntegerBitSet或ArrayBitSet。除了字段部分,这两种类型接口完全匹配。

  • DynamicBitSet:具有运行时确定大小的位集,由分配的usize切片支撑。

  • DynamicBitSetUnmanaged:DynamicBitSet的一种变体,不存储指向其分配器的指针,以此节省空间。

bit_set.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/bit_set.zig.html

1.8  总结

 通过翻阅标准库中的常用数据结构,我们可以熟悉 zig 的数据结构情况,毕竟这些数据结构是组成代码的骨架,不学不行,但是真正能在你日后项目中使用到的并不会多见。但是我们如果不熟悉这些标准库的玩法,后面想用就会非常困难,所以我们要学要看。Zig 数据结构文件有一个特点就是每一个文件后面都是有测试用例,通过这些测试用例我们就可以学会任何一个结构的用法。就这么多,多练多看这些数据结构,可能还需要大概记住这些大标题,日后我们还会用到呢。

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaodeshi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值