6个版本
0.2.4 | 2024年7月21日 |
---|---|
0.2.3 | 2024年5月21日 |
0.1.0 | 2024年4月10日 |
0.0.0 |
|
#305 in 数据结构
243 每月下载次数
在fibra中使用
125KB
1.5K SLoC
radixmap
这个crate是一个基于Rust的Radix树实现。Radix树,也称为Trie,是一种空间优化的树形数据结构,用于高效的信息检索。它的主要优点是空间优化、快速基于前缀的搜索和高效的内存使用。Radix树被广泛使用,尤其是在HTTP路由器中。
特性
- 快速基于前缀的查找
- 支持RadixMap和RadixSet
- 与标准集合兼容的接口
- 支持命名参数、glob和正则表达式
- 前序、后序、层序遍历
- 全面的单元测试确保正确性
示例
use bytes::Bytes;
use radixmap::{RadixMap, RadixResult};
fn main() -> RadixResult<()> {
let mut map = RadixMap::new();
map.insert("/api", "api")?;
map.insert("/api/v1", "v1")?;
map.insert("/api/v1/user", "user1")?;
map.insert("/api/v2", "v2")?;
map.insert("/api/v2/user", "user2")?;
assert_eq!(map.get(b"/api/v1/user"), Some(&"user1"));
assert_eq!(map.get(b"/api/v2/user"), Some(&"user2"));
let mut iter = map.iter(); // pre-order by default
assert_eq!(iter.next(), Some((&Bytes::from("/api"), &"api")));
assert_eq!(iter.next(), Some((&Bytes::from("/api/v1"), &"v1")));
assert_eq!(iter.next(), Some((&Bytes::from("/api/v1/user"), &"user1")));
assert_eq!(iter.next(), Some((&Bytes::from("/api/v2"), &"v2")));
assert_eq!(iter.next(), Some((&Bytes::from("/api/v2/user"), &"user2")));
assert_eq!(iter.next(), None);
Ok(())
}
基准测试
- MacBook Air, Apple M2 24G, Sonoma 14.4, Rust 1.78.0
名称 | 时间 |
---|---|
lookup-plain-16 | [29.149 ns 29.179 ns 29.215 ns] |
lookup-plain-64 | [34.797 ns 34.898 ns 35.017 ns] |
lookup-plain-512 | [51.162 ns 51.479 ns 51.917 ns] |
lookup-plain-1024 | [57.123 ns 57.782 ns 58.615 ns] |
insert-plain-16 | [1.3337 µs 1.3370 µs 1.3405 µs] |
insert-plain-64 | [7.8995 µs 7.9275 µs 7.9570 µs] |
insert-plain-512 | [103.13 µs 103.30 µs 103.52 µs] |
insert-plain-1024 | [255.19 µs 255.69 µs 256.26 µs] |
- AWS c5.2xlarge, 8C 16G, Ubuntu 22.04, Rust 1.78.0
名称 | 时间 |
---|---|
lookup-plain-16 | [42.448 ns 42.469 ns 42.489 ns] |
lookup-plain-64 | [47.602 ns 47.614 ns 47.625 ns] |
lookup-plain-512 | [62.200 ns 62.213 ns 62.226 ns] |
lookup-plain-1024 | [67.797 ns 67.805 ns 67.814 ns] |
insert-plain-16 | [2.3793 µs 2.3807 µs 2.3826 µs] |
insert-plain-64 | [13.704 µs 13.709 µs 13.714 µs] |
insert-plain-512 | [204.39 µs 204.97 µs 205.73 µs] |
insert-plain-1024 | [482.81 µs 484.23 µs 486.10 µs] |
依赖
~3.5–5MB
~92K SLoC