闽公网安备 35020302035485号
| 编号 | 树结构类型 | 支持 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. 树结构:Treeuse 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();
六、未来展望与社区参与