4

セット内にかなり大きな 2D ポイント (~20000) のセットがあり、xy 平面の各ポイントについて、セットのどのポイントが最も近いかを判断したいと考えています。(実際には、ポイントはさまざまなタイプであり、どのタイプが最も近いかを知りたいだけです。xy 平面はビットマップで、たとえば 640x480 です。)

この回答から、「 2D、C++ のすべての k 個の最近傍」という質問に対して、グリッドを作成するというアイデアが浮かびました。n*m の C++ ベクトルを作成し、どのビンに該当するかに応じてポイントをベクトルに配置しました。アイデアは、すべてのポイントではなく、ビン内のポイントの距離を確認するだけでよいということです。ビンにポイントがない場合は、隣接するビンをらせん状に続行します。

残念ながら、その後、Oli Charlesworth のコメントしか読んでいません。

残念ながら、隣接しているだけではありません (たとえば、東に 2 番目のセル内のポイントが、北東に直接あるセル内のポイントよりも近い可能性があると考えてください。この問題は、高次元ではさらに悪化します)。また、隣接するセルのポイントが 10 未満の場合はどうなるでしょうか。実際には、「スパイラルアウト」する必要があります。

幸いなことに、私はすでにスパイラル コードを把握していました ( C++ の優れたバージョンがここにあり、同じ質問に他のバージョンがあります)。しかし、私はまだ問題を抱えています:

  • セルでヒットを見つけた場合、隣接するセルでより近いヒットがある可能性があります (黄色は私のプローブ、赤は間違った選択、緑は実際の最も近いポイント):

    ここに画像の説明を入力

  • Oli Charlesworth が述べたように、隣接するセルにヒットが見つかった場合、2 歩離れたセルにヒットがある可能性があります。

    ここに画像の説明を入力

  • しかし、さらに悪いことに、2 歩離れたセルでヒットを見つけた場合でも、3 歩離れたセルでより近いヒットが発生する可能性があります。つまり、dx、dy= -3...3、または 49 個のセルを持つすべてのセルを考慮する必要があります。

    ここに画像の説明を入力

実際には、セルが十分に満たされるようにビンのサイズを選択できるため、これは頻繁には発生しません。それでも、すべてのポイントを反復せずに、正しい結果を得たいと思っています。

では、「スパイラル」または検索をいつ停止するかをどのように判断すればよいでしょうか? 複数のグリッドを重ねるアプローチがあると聞きましたが、よくわかりませんでした。このグリッド技術を救済することは可能ですか?

4

4 に答える 4

1

試している解決策

  • 最初に、ボックスあたりの平均ポイントが 1 (より大きなスキャンが必要な場合はそれ以上) になるようにグリッドを作成します。
  • 中央のボックスを選択します。少なくとも 1 つの隣接ボックスが見つかるまで、循環方式で隣接ボックスの選択を続けます。この時点で、1 つまたは 9 つなどのボックスを選択できます。
  • 隣接するボックスのレイヤーをもう 1 つ選択する
  • これで、ポイントのかなり小さなリストができました。通常は 10 個以下で、これを距離の式に入力して最近傍を見つけることができます。

ボックスごとに平均して 1 つのポイントがあるため、ほとんどの場合、9 つのボックスを選択して 9 つの距離を比較します。より良い結果を得るために、データセットのプロパティに従ってグリッド サイズを調整できます。

また、データに多くの分散がある場合は、2 レベルのグリッド (またはそれ以上) を試すことができます。そのため、選択が機能し、1 回のクエリで 50 を超えるポイントが返される場合は、グリッドの 1/10 で次のグリッド検索を開始します。サイズ ...

于 2015-10-17T05:06:38.853 に答える