4

半径Rが固定され、高さ、幅、長さが既知の空間の場合、その空間に3次元座標を持つ点のリストNが、固定内のすべての点を見つける効率的なアルゴリズムを探しています。グリッド上の任意の点の半径R。このクエリはさまざまなポイントで何度も実行されるため、迅速なクエリと引き換えに、費用のかかる前処理/並べ替えの手順を実行する価値がある場合があります。これは、私が取り組んでいるアプリケーションのボトルネックのステップであるため、いつでも切断できると便利です。

私がこれまでに試したこと:

-素朴なアルゴリズム、すべてのポイントを反復し、距離を計算します

-スペースを長さRの立方体のグリッドに分割し、これらにポイントを配置します。そうすれば、各ポイントについて、すぐ隣のバケットにクエリを実行するだけで済みます。これにより、大幅なスピードアップが実現します

-ヒューリスティックとしてマンハッタン距離を使用してみました。つまり、バケット内で、任意のポイントまでの距離を計算する前に、マンハッタン距離を使用して、半径R内に収まらない可能性のあるもの(つまり、マンハッタン距離が<= sqrt(3)* Rの場合)を除外します。 )。乗算ではなく加算が必要なため、これでスピードアップできると思いましたが、実際にはプログラムの速度が少し遅くなりました。

編集:距離を比較するために、平方根関数を使用する必要をなくすために、距離の2乗を使用します。

明らかに、これをどれだけスピードアップできるかにはある程度の制限がありますが、今試してみるための提案を使用することができます。

おそらくアルゴリズムレベルで問題になるわけではありませんが、私はCで作業しています。

4

6 に答える 6

3

半径で比較するのではなく、半径の 2 乗で比較してください。その理由は、2 点間の距離が より小さい場合、距離の 2R乗は より小さいからR^2です。

このように、距離の式を使用している場合、非常にコストのかかる操作である平方根を計算する必要はありません。

于 2012-06-15T15:35:10.140 に答える
3

ポイントを 3 次元のkd ツリーに格納すると、速度が向上する場合があります。これにより、O(log n) 償却時間で検索できます。

于 2012-06-15T15:37:19.980 に答える
1

Nicolas Brodu の NEIGHANDライブラリは、bin-lattice アルゴリズムを改善して、まさにあなたが望むことを行います。

詳細については、彼の記事を参照してください:近隣リクエストに対する球体インデックスのクエリ

于 2012-06-29T13:34:52.483 に答える
1

Binary Indexed Treeはどうですか? (Topcoder のチュートリアルを参照) n 次元に拡張でき、コーディングが簡単です。

于 2012-06-15T16:22:08.760 に答える
1

KD ツリーまたは z-curve の使用をお勧めします: http://en.wikipedia.org/wiki/Z-order_%28curve%29

于 2012-06-15T15:37:46.157 に答える