web-dev-qa-db-ja.com

特定の点に最も近い点

2D画像にランダムに選択されたピクセルのセットKがあります。画像内の他のすべてのピクセルについて、セットKのどのピクセルがそれに最も近いかを見つける必要があります(距離の標準的なsqrt(dx ^ 2 + dy ^ 2)測定値を使用)。ピクセルごとに複数の解決策がある可能性があることを認識しています。明らかに、セット内のすべてのピクセルに対してブルートフォースで行うことができますが、効率的ではないため、これは避けたいと思います。他に良い提案はありますか?

乾杯。

26
tw39124

平方根を気にする必要がないことを忘れないでください。

(実際の距離ではなく)最も近いものを見つけたい場合は、dx^2 + dy^2を使用します。これにより、各アイテムまでの距離の2乗が得られます。これも同様に便利です。

このピクセルのリストをラップするデータ構造がない場合は、それらすべてに対してテストする必要があります。

ある程度の柔軟性がある場合は、ワークロードを削減するための優れた方法がたくさんあります。 Quadtree を作成するか、ピクセルのソート済みリスト(xでソートおよびyでソート)を保持して、検索をより迅速に絞り込みます。

37
Rik Heywood

ボロノイ図 を作成することでjkとEwanに同意する必要があります。これにより、スペースがポリゴンに分割されます。 Kのすべてのポイントには、それに最も近いすべてのポイントを表すポリゴンがあります。ここで、ポイントのクエリを取得したら、それがどのポリゴンにあるかを見つける必要があります。この問題は Point Location と呼ばれ、 Trapezoidal Map を作成することで解決できます。

jkはすでに ボロノイ図 の作成にリンクされています フォーチュンのアルゴリズム これはO(n log n)の計算ステップを取り、O(n)スペースを要します。 このウェブサイト 台形の地図を作成する方法とそれを照会する方法を示します。また、そこにいくつかの境界を見つけることができます:
予想される作成時間:O(n log n)
予想されるスペースの複雑さ:O(n)

しかし、最も重要なのは、予想されるクエリ時間:O(log n)です。これは(理論的には)kDツリーのO(√n)よりも優れています。

私の情報源(上記のリンク以外)は次のとおりです。 計算幾何学:アルゴリズムとアプリケーション 、第6章と第7章。

ここには、2つのデータ構造に関する詳細情報(詳細な証明を含む)があります。 Googleブックス版には必要なものの一部しかありませんが、他のリンクで十分です。そのようなことに興味があるなら、その本を買うだけです(それは良い本です)。

16

ボロノイ図 の構築は 計算幾何学 の分岐です。 Delaunay Triangulations の構築には、同様の考慮事項が含まれます。次のいずれかを適応させることができる場合があります Delaunayアルゴリズム ニーズに合わせて。

  • フリップアルゴリズム
  • 増分
  • 分割統治
  • スイープライン
7
Ewan Todd

ポイントをKDツリーに配置します。この後、最近傍を見つけるのは非常に高速です。詳細については、ウィキペディアの this の記事を参照してください。

6
Andreas Brinck

これは最近傍探索と呼ばれます。ドナルド・クヌースはそれを郵便局の問題と呼んだ。

線形検索、局所性鋭敏型ハッシュ、ベクトル近似ファイル、空間分割など、いくつかの解決策があります。

それらをグーグルで検索すると役立つはずです。

5
Paul

あなたがしようとしているのは、 ボロノイ図 を構築することです。これは、 平面スイープ を使用してO(n log n)で実行できます。

5
jk.

別のヒント:距離は常に各座標の差以上であり、常にそれらの合計以下です。

d >= dx, d >= dy, d <= dx + dy.

これにより、並べ替えをより効率的に行うことができます。

4
balpha

このグラフィックがピクセルでどれだけ密集しているかによっては、Originのピクセルから外側に向かって検索する方がよい場合があります。

グラフィック端末エミュレーション用にこのようなものをプログラムしました。結局、中心点から伸びる四角いスパイラルの形で検索パターンをプログラミングし、何かにぶつかるまで成長させました。古いCPUでも、この目的には十分な速さでした。

1
Carl Smotricz