#radix-tree #patricia #trie #radix #key-set

patriciatree

基于patricia树的高效内存数据结构

26个不稳定版本 (7个破坏性更新)

0.8.0 2023年12月10日
0.6.3 2023年10月25日
0.6.2 2023年7月24日
0.5.5 2023年1月23日
0.1.1 2017年9月25日

#80 in 数据结构

Download history 5175/week @ 2024-04-08 7109/week @ 2024-04-15 6524/week @ 2024-04-22 7869/week @ 2024-04-29 7908/week @ 2024-05-06 7080/week @ 2024-05-13 8789/week @ 2024-05-20 7597/week @ 2024-05-27 9234/week @ 2024-06-03 8987/week @ 2024-06-10 7841/week @ 2024-06-17 8573/week @ 2024-06-24 7789/week @ 2024-07-01 9817/week @ 2024-07-08 7624/week @ 2024-07-15 8345/week @ 2024-07-22

33,755 monthly downloads
15 个crate中使用 (直接使用10个)

MIT 许可证

110KB
2.5K SLoC

patricia_tree

patricia_tree Documentation Actions Status Coverage Status License: MIT

基于patricia树的高效内存数据结构(也称为radix树)。

文档

patricia树中的键的公共前缀由共享路径表示。因此,如果键集的前缀高度冗余,生成的patricia树的内存使用量将显著低于更通用的数据结构(例如,BTreeMap)。

有关更多信息,请参阅Radix树

示例

use patricia_tree::PatriciaMap;

let mut map = PatriciaMap::new();
map.insert("foo", 1);
map.insert("bar", 2);
map.insert("baz", 3);
assert_eq!(map.len(), 3);

assert_eq!(map.get("foo"), Some(&1));
assert_eq!(map.get("bar"), Some(&2));
assert_eq!(map.get("baz"), Some(&3));

基准测试

$ cargo run --example insert_lines --release -- --version 2> /dev/null
insert_lines 0.1.0

///
/// INPUT: Wikipedia
///
$ curl -s https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-all-titles-in-ns0.gz | gzip -d > enwiki-latest-all-titles-in-ns0
$ du -hs enwiki-latest-all-titles-in-ns0
271M    enwiki-latest-all-titles-in-ns0

// HashSet
$ /usr/bin/time -f "# ELAPSED: %E\n# MEMORY: %M" cargo run --example insert_lines --release -- --kind hash < enwiki-latest-all-titles-in-ns0
# LINES: 13450823
# ELAPSED: 0:10.23
# MEMORY: 1001548  // 978 MB

// BTreeSet
$ /usr/bin/time -f "# ELAPSED: %E\n# MEMORY: %M" cargo run --example insert_lines --release -- --kind btree < enwiki-latest-all-titles-in-ns0
# LINES: 13450823
# ELAPSED: 0:10.90
# MEMORY: 1112068  // 1,086 MB

// PatriciaSet
$ /usr/bin/time -f "# ELAPSED: %E\n# MEMORY: %M" cargo run --example insert_lines --release -- --kind patricia < enwiki-latest-all-titles-in-ns0
# LINES: 13450823
# ELAPSED: 1:12.55
# MEMORY: 434340   // 424 MB

///
/// INPUT: Google 5-gram
///
$ curl -s http://storage.googleapis.com/books/ngrams/books/googlebooks-eng-all-5gram-20120701-0.gz | gzip -d > googlebooks-eng-all-5gram-20120701-0
$ du -hs googlebooks-eng-all-5gram-20120701-0
331M    googlebooks-eng-all-5gram-20120701-0

// HashSet
$ /usr/bin/time -f "# ELAPSED: %E\n# MEMORY: %M" cargo run --example insert_lines --release -- --kind hash < googlebooks-eng-all-5gram-20120701-0
# LINES: 9814743
# ELAPSED: 0:08.36
# MEMORY: 1115544  // 1,089 MB

// BTreeSet
$ /usr/bin/time -f "# ELAPSED: %E\n# MEMORY: %M" cargo run --example insert_lines --release -- --kind btree < googlebooks-eng-all-5gram-20120701-0
# LINES: 9814743
# ELAPSED: 0:06.85
# MEMORY: 942236   // 920 MB

// PatriciaSet
$ /usr/bin/time -f "# ELAPSED: %E\n# MEMORY: %M" cargo run --example insert_lines --release -- --kind patricia < googlebooks-eng-all-5gram-20120701-0
# LINES: 9814743
# ELAPSED: 0:25.62
# MEMORY: 223616   // 218 MB

依赖项

~80–275KB