2个版本

0.1.2 2022年10月30日
0.1.0 2022年10月25日

#1064 in 算法

MIT/Apache

66KB
496

Hilbert曲线算法

github Rust Build, Test and Coverage crates.io docs.rs codecov

Hilbert曲线算法的Rust实现。该库可以从点(x, y)移动到索引(z),以及从索引(z)移动到点(x, y)。

作为库的消费者

安装

cargo add hilbert-curve-rust

关于Crate.io的详细信息

如何使用?

Hilbert Curve Rust库的Rust文档可在网上找到。然而,以下有两个示例以供开始。

索引到点

单维整数到二维坐标

let hilbert_curve = HilbertCurveAlgorithm::new(1); // Set the Hilbert order here
let point = hilbert_curve.index_to_point(0); // Get the point for index 0

点到索引

二维坐标到单维整数。

let hilbert_curve = HilbertCurveAlgorithm::new(1);// Set the Hilbert order here
let index = hilbert_curve.point_to_index(CoordinateValue { x: 0, y: 0 }); // Get the index for (0,0) point

作为Hibert Curve Rust库的开发者

如果您想为Hibert Curve Rust代码库做出贡献,以下是一些可能有用的信息。

测试和覆盖率

覆盖率

在运行覆盖率之前,您必须安装一些组件

cargo install grcov
rustup component add llvm-tools-preview

然后,您可以运行

./coverage.sh

更多解释请参见Mozilla grcov网站

文档

cargo doc --open

基准测试

./benchmark.sh

发布

cargo login
cargo publish --dry-run
cargo publish

与其他Rust库的性能比较

在8阶上的比较

基准测试找出每个位置(x,y)的所有索引,并计算出扫描所有位置的平均时间。

平均值
fast_hilbert 0.3364 ms
hilbert_curve 0.7496 ms
hilbert-curve-rust 1.0290 ms
hilbert_2d 1.3298 ms
hilbert 9.9606 ms

在不同阶数上比较每个框架

测试循环遍历所有x, y坐标以查找索引。以下是每个框架的平均值。

图中显示了三个明显的组。最差的算法是hilbert,它在10阶之后呈指数级变差。

第二组包含这个库(hilbert-curve-rust),性能更稳定,但大约在12阶时开始变差。

最后一组有一个算法,即fast_hilbert,是明显最快的算法。

从某些角度来看,1024x1024(约100万个点/像素)的网格对于任何库来说都很不错。然而,如果您需要从8192x8192(13阶,67百万个点/像素)的网格开始,那么使用fast_hilbert可能更好。图表显示了第二组紧挨着最佳组,但现实是fast_hilbert可以比其他三个竞争者快10倍。

性能学习经验

通过在函数update_rx_from_pointupdate_ry_from_pointupdate_point_value_from_numbermove_pointrotate_point中使用引用而不是复制值,将基准测试减少了约3秒。

图表显示了使用引用而不是不可变值时的变化,以前基准测试用红色表示,而蓝色表示使用引用。通过移除对象的副本并传递引用,程序需要创建更少的内存,并且只需更改特定内存中的值。这种收益是显著的。

无运行时依赖