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

news2025/3/2 3:45:58

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙轻内核Kconfig使用笔记

鸿蒙轻内核使用Kconfig进行图形化配置,本文专门讲解下鸿蒙轻内核LiteOS-M和LiteOS-A的图形化配置方法。本文中所涉及的源码,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 、 https://gitee.com/openharmony/kernel_liteos_m 获取。本…

【NLP练习】Transformer中的位置编码

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、什么是位置编码 1. 位置编码定义 Transformer 模型中的位置编码是为了在处理序列数据时引入位置信息,以便模型能够分辨输入序列中不同位置的词…

Cask ‘oraclexxx‘ is unavailable: No Cask with this name exists.

brew search oracle-jdk或brew search --cask oracle-jdk 原因:Homebrew官方仓库不再维护多个旧版本的OracleJDK 不推荐使用Homebrew环境安装JDK //指定版本安装 brew install --cask temurin17 //设置 JAVA_HOME 环境变量 //找到安装的JDK 版本的路径 /usr/lib…

Pytorch环境配置的方法

Pytorch虚拟环境配置全流程 以安装pytorch1.9.1为例 1. 创建虚拟环境 安装Anaconda3,打开 PowerShell 创建虚拟环境并进入: conda create -n torch1.9.1 python3.8 conda activate torch1.9.1 conda create -n torch1.9.1 python3.8 conda activate to…

Day 22:2786. 访问数组中的位置使分数最大

Leetcode 2786. 访问数组中的位置使分数最大 给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你 一开始 在数组的位置 0 处&#xff0c;你可以按照下述规则访问数组中的其他位置&#xff1a; 如果你当前在位置 i &#xff0c;那么你可以移动到满足 i < j 的 任意 …

图解 React diff 算法

Render 阶段会生成 Fiber Tree&#xff0c;所谓的 diff 实际上就是发生在这个阶段&#xff0c;这里的 diff 指的是 current FiberNode 和 JSX 对象之间进行对比&#xff0c;然后生成新的的 wip FiberNode。 除了 React 以外&#xff0c;其他使用到了虚拟 DOM 的前端框架也会有类…

Springboot(若依)国际化配置接口访问后返回????????

最近使用若依的框架进行二次开发&#xff0c;配置了国际化&#xff0c;application.yml配置英文时没问题&#xff0c;但配置中文basename: i18n/messages_zh_CN&#xff0c;访问接口就直接返回的???&#xff0c;如图&#xff1a; 于是检查了I18nConfig文件&#xff0c;没配错…

【Linux】基础IO——文件描述符,重定向

话接上篇&#xff1a; 1.文件描述符fd 磁盘文件 VS 内存文件&#xff1f; 当文件存储在磁盘当中时&#xff0c;我们将其称之为磁盘文件&#xff0c;而当磁盘文件被加载到内存当中后&#xff0c;我们将加载到内存当中的文件称之为内存文件。磁盘文件和内存文件之间的关系就像程…

数据结构:手撕代码——顺序表

目录 1.线性表 2.顺序表 2.1顺序表的概念 2.2动态顺序表实现 2.2-1 动态顺序表实现思路 2.2-2 动态顺序表的初始化 2.2-3动态顺序表的插入 检查空间 尾插 头插 中间插入 2.2-4 动态顺序表的删除 尾删 头删 中间删除 2.2. 5 动态顺序表查找与打印、销毁 查找 …

3D打印重塑模具行业 破解瓶颈难题

模具行业之所以享有“工业之母”的美誉&#xff0c;是因为它与各个制造业领域紧密相连&#xff0c;是制造业不可或缺的一部分。模具在零部件加工中扮演着至关重要的角色&#xff0c;能够提供高度可靠的产品&#xff0c;传统模具制造一直面临制造周期长和制造成本高两个主要问题…

LeetCode452用最少数量的箭引爆气球

题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处…

Determinant 一个翻译很不友好的名字 行列式 det(A)

Determinant 一个翻译很不友好的名字 行列式 det(A) flyfish determinant 美[dɪtɜːrmɪnənt] 英[dɪtɜːmɪnənt] adj. 决定性的n. 决定性因素 / <数>行列式 / 决定因素 / 方阵举一个最简单的例子说明行列式 假设有一个 2x2 矩阵 A&#xff1a; A ( 2 1 1 2…

Python **运算符(python**kwargs:参数解包)(kwargs:keyword arguments)

文章目录 Python中的 ** 运算符&#xff1a;参数解包参数解包基础语法和示例 在函数定义中使用 **示例代码 使用场景和好处1. 灵活性&#xff1a;使用 **kwargs 允许函数设计得更加灵活&#xff0c;可以接受未来可能增加的新参数而无需修改函数定义。2. 可读性和可维护性&#…

list容器的基本使用

目录 前言一&#xff0c;list的介绍二&#xff0c;list的基本使用2.1 list的构造2.2 list迭代器的使用2.3 list的头插&#xff0c;头删&#xff0c;尾插和尾删2.4 list的插入和删除2.5 list 的 resize/swap/clear 前言 list中的接口比较多&#xff0c;与string和vector类似&am…

FastJson与JackSon 的碰撞。服务发送方与服务接收方字段不一致问题

情景再现 对接文档人家要求字段为 于是乎 咱就在服务的发送方定义参数字段为 服务接收方接收的类型为 later。。。。。 服务接收方接收到的参数字段 就不变成了fOrgId。跟外部系统对接就提示参数错误 原因 &#xff1a;lombok 在做set get的时候自动 无论你字段的首字母是大…

uni-app 小程序:显示图片并且点击图片展示大图

效果如图所示&#xff1a; 在页面显示一张图片&#xff0c;然后点击该张图片后显示大图。点击大图就可以关闭大图。 实现的主要代码如下&#xff1a; <image :src"imgpath" mode"aspectFill" click"imgPreview(imgArr)"></image> 其…

【C语言】递归复杂度与链表OJ之双指针

【C语言】递归复杂度与链表OJ之双指针 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【C语言】递归复杂度与链表OJ之双指针前言一.递归复杂度1.1递归时间复杂度1.2递归空间复杂度 二.链表OJ之双指针2.1倒数第K个节点2.2链…

LangChain入门学习笔记(一)——Hello World

什么是LangChain LangChain是一个开源&#xff08;github repo&#xff09;的大语言模型应用开发框架&#xff0c;提供了一整套的工具、方法和接口去帮助程序员构建基于大语言模型的端到端应用。LangChain是长链&#xff08;long chain&#xff09;的意思&#xff0c;它的一个…

Flowable-决策表设计器

✨✨✨ 最好用的Flowable决策表设计器 ✨✨✨ 最好用的Flowable流程设计器 本文中内容和案例出自贺波老师的书《深入Activiti流程引擎&#xff1a;核心原理与高阶实战》&#xff0c;书中的介绍更全面、详细&#xff0c;推荐给大家。 深入Activiti流程引擎

深入理解渲染引擎:打造逼真图像的关键

在数字世界中&#xff0c;图像渲染是创造逼真视觉效果的核心技术。渲染引擎&#xff0c;作为这一过程中的关键组件&#xff0c;负责将二维或三维的模型、纹理、光照等数据转化为人们肉眼可见的二维图像。本文将深入探讨渲染引擎的工作原理及其在打造逼真图像中所起的关键作用。…