kdtree rs
1.0.0
K-мерное дерево в Rust для быстрой геопространственной индексации и поиска ближайших соседей
Добавьте kdtree
в Cargo.toml
[ dependencies ]
kdtree = " 0.7.0 "
Добавьте точки в kdtree и запросите ближайшие n точек с помощью функции расстояния.
use kdtree :: KdTree ;
use kdtree :: ErrorKind ;
use kdtree :: distance :: squared_euclidean ;
let a : ( [ f64 ; 2 ] , usize ) = ( [ 0f64 , 0f64 ] , 0 ) ;
let b : ( [ f64 ; 2 ] , usize ) = ( [ 1f64 , 1f64 ] , 1 ) ;
let c : ( [ f64 ; 2 ] , usize ) = ( [ 2f64 , 2f64 ] , 2 ) ;
let d : ( [ f64 ; 2 ] , usize ) = ( [ 3f64 , 3f64 ] , 3 ) ;
let dimensions = 2 ;
let mut kdtree = KdTree :: new ( dimensions ) ;
kdtree . add ( & a . 0 , a . 1 ) . unwrap ( ) ;
kdtree . add ( & b . 0 , b . 1 ) . unwrap ( ) ;
kdtree . add ( & c . 0 , c . 1 ) . unwrap ( ) ;
kdtree . add ( & d . 0 , d . 1 ) . unwrap ( ) ;
assert_eq ! ( kdtree.size ( ) , 4 ) ;
assert_eq ! (
kdtree.nearest ( &a. 0 , 0 , &squared_euclidean ) .unwrap ( ) ,
vec! [ ]
) ;
assert_eq ! (
kdtree.nearest ( &a. 0 , 1 , &squared_euclidean ) .unwrap ( ) ,
vec! [ ( 0f64 , & 0 ) ]
) ;
assert_eq ! (
kdtree.nearest ( &a. 0 , 2 , &squared_euclidean ) .unwrap ( ) ,
vec! [ ( 0f64 , & 0 ) , ( 2f64 , & 1 ) ]
) ;
assert_eq ! (
kdtree.nearest ( &a. 0 , 3 , &squared_euclidean ) .unwrap ( ) ,
vec! [ ( 0f64 , & 0 ) , ( 2f64 , & 1 ) , ( 8f64 , & 2 ) ]
) ;
assert_eq ! (
kdtree.nearest ( &a. 0 , 4 , &squared_euclidean ) .unwrap ( ) ,
vec! [ ( 0f64 , & 0 ) , ( 2f64 , & 1 ) , ( 8f64 , & 2 ) , ( 18f64 , & 3 ) ]
) ;
assert_eq ! (
kdtree.nearest ( &a. 0 , 5 , &squared_euclidean ) .unwrap ( ) ,
vec! [ ( 0f64 , & 0 ) , ( 2f64 , & 1 ) , ( 8f64 , & 2 ) , ( 18f64 , & 3 ) ]
) ;
assert_eq ! (
kdtree.nearest ( &b. 0 , 4 , &squared_euclidean ) .unwrap ( ) ,
vec! [ ( 0f64 , & 1 ) , ( 2f64 , & 0 ) , ( 2f64 , & 2 ) , ( 8f64 , & 3 ) ]
) ;
cargo bench
с процессором Intel i5-7360U 2,3 ГГц:
cargo bench
Running target/release/deps/bench-9e622e6a4ed9b92a
running 2 tests
test bench_add_to_kdtree_with_1k_3d_points ... bench: 106 ns/iter (+/- 25)
test bench_nearest_from_kdtree_with_1k_3d_points ... bench: 1,237 ns/iter (+/- 266)
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured; 0 filtered out
Спасибо Eh2406 за различные исправления и улучшения производительности.
Лицензировано по любому из
по вашему выбору.
Если вы явно не указали иное, любой вклад, намеренно представленный вами для включения в работу, как это определено в лицензии Apache-2.0, должен иметь двойную лицензию, как указано выше, без каких-либо дополнительных положений и условий.