编号 | 树结构类型 | 支持 2D | 支持 3D | kNN 搜索 | 范围搜索 |
---|---|---|---|---|---|
1 | Quadtree | ✅ | ❌ | ✅ | ✅ |
2 | Octree | ❌ | ✅ | ✅ | ✅ |
3 | Kd-tree | ✅ | ✅ | ✅ | ✅ |
4 | R-tree | ✅ | ✅ | ✅ | ✅ |
5 | R*-tree | ✅ | ✅ | ✅ | ✅ |
生态丰富:与 NumPy、Pandas、Scikit-learn 等库无缝对接,适合做数据可视化或机器学习预处理。
cargo add spart要求 Rust 版本 >= 1.83.0
pip install pyspartPython 使用示例(假设你已经安装了 pyspart):
from pyspart import KdTree # 创建一个二维 Kd-tree tree = KdTree(dim=2) # 堆代码 duidaima.com # 插入点数据 tree.insert([1.0, 2.0], data="Point A") tree.insert([3.0, 4.0], data="Point B") # 查询最近的1个邻居 nearest = tree.knn_search([2.0, 3.0], k=1) print(nearest) # 输出:[[3.0, 4.0, 'Point B']]四、核心功能详解
use spart::geometry::{Point2D, Point3D}; let p2d = Point2D::new(1.0, 2.0, Some("2D点")); let p3d = Point3D::new(1.0, 2.0, 3.0, Some("3D点"));2. 树结构:Tree
use spart::quadtree::{Quadtree, Rectangle}; let boundary = Rectangle { x: 0.0, y: 0.0, width: 100.0, height: 100.0, }; let mut tree = Quadtree::new(&boundary, 4).unwrap(); tree.insert(Point2D::new(10.0, 20.0, None));3. 自定义距离函数
use spart::geometry::{Point2D, DistanceMetric}; struct ManhattanDistance; impl<T> DistanceMetric<Point2D<T>> for ManhattanDistance { fn distance_sq(p1: &Point2D<T>, p2: &Point2D<T>) -> f64 { ((p1.x - p2.x).abs() + (p1.y - p2.y).abs()).powi(2) } } // 使用自定义距离 tree.knn_search::<ManhattanDistance>(&query_point, 1);五、数据持久化:支持序列化
[dependencies] spart = { version = "0.3.0", features = ["serde"] }使用示例:
use bincode; use std::fs::File; use std::io::{Read, Write}; // 保存树到文件 let encoded: Vec<u8> = bincode::serialize(&tree).unwrap(); let mut file = File::create("tree.bin").unwrap(); file.write_all(&encoded).unwrap(); // 从文件加载树 let mut file = File::open("tree.bin").unwrap(); let mut encoded = Vec::new(); file.read_to_end(&mut encoded).unwrap(); let tree: Quadtree<f64, String> = bincode::deserialize(&encoded).unwrap();六、未来展望与社区参与