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());