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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In