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中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对