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

2024-06-15 02:04

本文主要是介绍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 数据结构文件有一个特点就是每一个文件后面都是有测试用例,通过这些测试用例我们就可以学会任何一个结构的用法。就这么多,多练多看这些数据结构,可能还需要大概记住这些大标题,日后我们还会用到呢。

这篇关于Zig标准库:最全数据结构深度解析(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062120

相关文章

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循