周期的な境界条件を持つ D 次元空間に N ポイントの点群があります。ここで、N は 500 から 10^8 の範囲で、D は 1 から 20 の範囲です。一緒。点群の各点について、その点に最も近い k 個を見つける必要があります。また、各ポイントからの距離、特に maxnorm 距離内にいくつのポイントが存在するかを調べる必要もあります。どのポイントが半径内にあるかを知る必要はありませんが、いくつあるかはわかりませんが、追加すると便利です。
私は kd-trees を試しましたが、それらはラッピング境界を処理しません。また、より大きなツリーの場合、複製は実行できません。さらに、高次元では遅くなります。
Vantage Point Trees に出会い、いくつかのコードを試してみましたが、kd ツリーよりも低速です。私が見つけたコードは再帰的な検索方法を使用していますが、バッチ処理はありません。プラス面の 1 つは、ラッピング条件をネイティブに処理できるため、重複する必要がないことです。
反復アプローチに変換し、バッチ検索ができるかどうかを確認することで、VP ツリーからさらにパフォーマンスを引き出すことができるかどうかを確認しようとしていますが、考えがありました。これらのデータ構造はすべて、任意のクエリ ポイントの最近傍を見つけるために機能しますが、クエリ ポイントはポイント クラウド内のポイントに制限されています。この制限により、よりパフォーマンスの高い構造が可能になる可能性があると思います(おそらくある種のナビゲーションメッシュですか?)。これを処理する構造を検索しようとしましたが、私のgoogle-fuは失敗しています。だから、誰かが次を処理できるデータ構造を知っているかどうか疑問に思っています:
- 500 ~ 10^8 ポイントなど、少数および多数のポイントを処理する
- 最大 20 次元を処理
- 周期的な境界で作業する (つまり、平らなトーラス)
- maxnorm距離で作業します(ソフト要件。ユークリッドは、手動で選別できる潜在的なリストを提供できますが、maxnormが優先されます)
- クエリ ポイントまでの k-NN を検索し、クエリ ポイントまでの距離でいくつのポイントが存在するかを検索できます
- クエリ ポイントは構造内のポイントであり、任意のポイントではありません
- クエリはバッチ処理できます。つまり、点群のすべての点について k 番目の NN を見つける必要があります。また、各点 i について、d[i] 内にいくつの点が存在するかを調べる必要があります。つまり、各ポイントには異なる検索半径があります。
- 挿入または削除をサポートする必要はありません。
ありがとう