Crates.io | im_ternary_tree |
lib.rs | im_ternary_tree |
version | 0.0.18 |
source | src |
created_at | 2021-11-01 06:40:05.743231 |
updated_at | 2024-02-25 14:59:02.544857 |
description | Structural sharing ternary tree, i.e. immutable data structure |
homepage | https://github.com/calcit-lang/ternary-tree.rs/ |
repository | https://github.com/calcit-lang/ternary-tree.rs/ |
max_upload_size | |
id | 475041 |
size | 740,628 |
a variant of 2-3 tree, with enhancements on ternary branching, optimized with tricks like finger-tree.
t.pop_left()
and t.push_right(..)
is optimized to be amortized O(1)
at best cases and O(log n)
when restructuring involed.
Tree layout from 0 to 159 watch video or try live demo.
Docs https://docs.rs/im_ternary_tree/ .
use im_ternary_tree::TernaryTreeList;
println!("{}", TernaryTreeList::<usize>::from(&[]));
// assoc
let origin5 = [1, 2, 3, 4, 5];
let data5 = TernaryTreeList::from(&origin5);
let updated = data5.assoc(3, 10);
println!("{}", data5.format_inline());
println!("{}", updated.format_inline());
assert_eq!(updated.unsafe_get(3), 10);
方案设计的中文介绍 https://www.bilibili.com/video/BV1z44y1a7a6/
This library has special optimizations on push_right
and pop_left
with tricks from finger-tree.
And as its size grows, it's always operating on a shallow branch at right end, wasting fewer nodes for indexing new elements, a random demo looks like:
Also the left branches are kept shallow on purpose so it can be cheaper in pop_left
. Totally inspired by finger-tree.
pop_right
and push_left
.MIT