实用简洁数据结构设计与应用
1 引言
简洁数据结构(SDS)能够以较小的空间存储数据,并支持高效的数据操作。在信息理论中,编码数据存在一个信息理论下界,即每个数据项至少需要 ⌈log |D|⌉ 位(以 2 为底)来唯一标识,其中 D 是数据的域。SDS 的挑战在于在满足信息理论下界的基础上,利用额外的 r 位冗余信息,快速执行查询操作,最好能达到每个查询的常数时间复杂度。
SDS 最初是在理论环境中提出的,如今已广泛应用于各种数据类型,如整数集、序列、字符串、树、图等。随着软件技术的发展,一些高效的 SDS 库逐渐涌现,如 C++ 库 libcds、rsdic、SDSL 以及 Java/C++ 库 Sux 等。这些库结合了数据压缩和高效数据结构的优势,能够直接对压缩数据进行操作,适用于大规模数据集。
2 基本工具集
2.1 子集和位向量
位向量是 SDS 的基本构建块,它是一个由 0 和 1 组成的有限序列。位向量可以被解释为有序宇宙 U 的子集,其中第 i 位为 1 表示 U 中的第 i 个元素属于该子集,为 0 则表示不属于。信息理论下界为 ⌈log $\binom{|U|}{m}$⌉,其中 m 是 1 的数量。
Rank 和 Select 是位向量的两个重要原语:
- Rank1(i):返回 s[0, i) 中 1 的数量。
- Select1(i):返回第 i 个 1 的位置。
Predecessor1(i) 是与 Rank/Select 紧密相关的操作,它返回小于或等于 i 的最右侧 1 的位置。
利用 Rank1 可以实现稀疏数组的空间优化。
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



