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 在 数据结构
68KB
1K SLoC
prefix_array
该包提供了PrefixArray
和PrefixArraySet
数据结构,这些数据结构实现了某些类似于Map和Set的接口,同时也能根据数据的前缀进行查询。
prefix_array具有零内存开销,log n
搜索,以及对主数组子集的搜索。此包还具有比树型数据结构更好的缓存局部性优势。
no_std
支持
该包具有no_std能力,但默认启用了std
功能(目前这添加了HashMap
和HashSet
的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
,但可以在每次调用之间共享状态,请考虑使用 ScratchSpace
和 extend_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());