#prefix #search #generic #array #collection #prefix-tree

no-std prefix_array

一个用于在键的前缀上搜索的泛型容器

8个版本

0.3.2 2023年10月16日
0.3.1 2023年10月14日
0.3.0 2023年8月22日
0.2.5 2023年8月18日
0.1.0 2023年3月14日

#943数据结构

MPL-2.0 许可证

68KB
1K SLoC

prefix_array

该包提供了PrefixArrayPrefixArraySet数据结构,这些数据结构实现了某些类似于Map和Set的接口,同时也能根据数据的前缀进行查询。

prefix_array具有零内存开销,log n搜索,以及对主数组子集的搜索。此包还具有比树型数据结构更好的缓存局部性优势。

no_std 支持

该包具有no_std能力,但默认启用了std功能(目前这添加了HashMapHashSet的From实现)。

许可证

此包根据MPL-2.0许可证授权(Rust包中不常见),这大致意味着您可以在封闭源代码项目中使用此包并静态链接它,但对包本身的任何修改都必须公开。这并不是法律建议。


lib.rs:

prefix_array是一个包含数据结构的包,这些数据结构有助于根据字符串键的前缀查询数据,其主要功能是在具有共同前缀的子组中进行搜索和细化。

当您需要一个类似于HashMap的结构时,请使用PrefixArray,当您需要一个类似于HashSet的结构时,请使用PrefixArraySet

创建PrefixArray(Set)

对于创建新的集合,理想情况下您可以使用FromIterator实现,这具有O(n log n)复杂度,并且与一个ExactSizeIterator一起将分配一次。如果您不能使用FromIterator,则建议使用PrefixArray(Set)::from_vec_lossy,因为这正是FromIterator在底层调用的。

不建议在循环中使用 insert 来创建 PrefixArray(Set),因为这具有 O(n^2) 的时间复杂度。

如果您希望向一个已经部分填充的 PrefixArray(Set) 插入多个项目,请考虑使用专门为此目的设计的 Extend 实现。

如果您有一个部分填充的 PrefixArray(Set) 并需要多次调用 Extend,但可以在每次调用之间共享状态,请考虑使用 ScratchSpaceextend_with 方法。这可以避免 Extend 方法可能导致的过度分配(因为它需要分配以一次插入多个项目)。

基本用法

use prefix_array::PrefixArray;

// construct a new prefix array from an iterator
let arr = PrefixArray::from_iter([("abcde", 123), ("absgh", 1234)]);

// borrow a subslice of all data with the prefix 'ab'
let mut subslice = arr.find_all_with_prefix("ab");

assert_eq!(subslice.len(), 2);

// we can refine the subslice
subslice = subslice.find_all_with_prefix("abc");

assert_eq!(subslice.len(), 1);

// and find when something doesn't exist
assert!(subslice.find_all_with_prefix("ba").is_empty());

无运行时依赖