質問

長方形に含まれるポイントのセットがあります。長方形をポイント密度に基づいて副伸びに分割したいと思います(どちらかのどちらかのどちらかのサブレクタングルまたは望ましい密度を与えます)。

パーティション化は正確である必要はありません(通常のグリッドよりもほぼほぼすべての近似が行われます)が、アルゴリズムは多数のポイントに対処する必要があります。 200百万。ただし、必要なサブレクタングルの数は大幅に低く(約1000)。

この特定のタスクで私を助けるかもしれないアルゴリズムを知っている人はいますか?

役に立ちましたか?

解決

問題を理解するためだけに。以下は粗雑であり、ひどく実行されますが、結果があなたが望むものであるかどうかを知りたい>

仮定>長方形の数は均等です
仮定>ポイント分布は著しく2Dです(1行に大きな蓄積はありません)

手順>
いずれかの軸でN/2回を二等分し、以前に決定された各長方形のカウント「パス」ポイントの一方の端からもう一方の端にループし、各反復でパスポイントの数を保存します。カウントされたら、各ループでカウントされたポイントで選択する長方形を二等分します。

それはあなたが達成したいことですか?

他のヒント

標準のKDツリーまたはバイナリスペースパーティションツリーの後を追っていると思います。 (ウィキペディアで調べることができます。)

あなたは非常に多くのポイントを持っているので、あなたは最初の数レベルをほぼ分割することを望むかもしれません。この場合、200mポイントのランダムなサンプル(そのうちの200k)を採取し、サブサンプルの中間点で完全なデータセットを分割する必要があります(どちらの軸が長くても)。実際にランダムにポイントを選択すると、細分化する必要があるポイントの巨大なクラスターを見逃す可能性は約ゼロになります。

これで、それぞれ約100mポイントの2つの問題があります。長い軸に沿ってそれぞれを分割します。サブサンプルの採取を停止し、データセット全体に沿って分割するまで繰り返します。 10回の幅広い反復の後、あなたは完了します。

別の問題がある場合 - x軸とy軸に沿ってティックマークを提供し、Kd-Treeの不規則な分解を持っているのではなく、できる限り最善の軸に沿ってグリッドを埋める必要があります。各軸に沿って0/32、1/32、...、32/32パーセンタイルを見つけます。そこにグリッドラインを描き、結果の1024要素グリッドをポイントで埋めます。

@belisariusがすでに提案しているものに近い、次のことから始めると思います。 「ほぼ正方形の」長方形を「長くて薄い」ものよりも好むなど、追加の要件がある場合は、この素朴なアプローチを変更する必要があります。簡単にするために、ポイントがほぼランダムに分散されていると思います。

  1. 最初の長方形を長方形の短い側に平行な線で2に分割し、ミッドポイントを正確に実行します。
  2. 両方の半分の長方形のポイント数をカウントします。それらが等しい場合(十分)、ステップ4に進みます。それ以外の場合は、ステップ3に進みます。
  3. ハーフレクタングル間のポイントの分布に基づいて、ラインを再び物事に移動します。したがって、最初のカットがポイントを1/3、2/3に分割した場合、ラインを長方形の重い半分に移動します。ステップ2に進みます(ここに閉じ込められないように注意してください。最初に一方の方向に、次にもう一方の方向にステップを減らすことでラインを移動します。)
  4. 次に、手順1に、この機能への再帰呼び出しに半系列のそれぞれを渡します。

それが提案の概要を十分に概説することを願っています。制限があります。2のパワーに等しい多数の長方形を生成するため、十分でない場合は調整します。私はそれを再帰的に述べていますが、それは並列化に理想的です。各分割は2つのタスクを作成し、それぞれが長方形を分割し、さらに2つのタスクを作成します。

あなたがそのアプローチが気に入らないなら、おそらくあなたはあなたが望む長方形の数のいくつかの複数(10-100)の通常のグリッドから始めることができます。これらの小さな長方形のそれぞれのポイント数を数えます。次に、小さな長方形に適切な数のポイントが含まれるまで、小さな長方形を一緒に接着し始めます。または、要件を十分に満たす場合は、これを離散化方法として使用し、最初のアプローチと統合することができますが、小さな長方形の境界に沿って切断線のみを配置できます。各小さな長方形のポイントを1回だけカウントする必要があるため、これはおそらくはるかに速いでしょう。

これらのどちらの実行時間についても考えていません。私は以前のアプローチを好みます。

良い質問。

調査する必要がある領域は、「計算ジオメトリ」と「kパーティション」の問題だと思います。あなたを始めるのに役立つかもしれないリンクがあります ここ

問題自体がNPハードであることがわかるかもしれません。

します k-meansクラスタリング またはa ボロノイ図 あなたが解決しようとしている問題に適していますか?

それはように見えます クラスター分析.

a Quadtree 仕事?

Quadtreeは、各内部ノードに正確に4人の子供がいるツリーデータ構造です。 Quadtreeは、4つの象限または領域に再帰的に細分化することにより、2次元空間を分割するために最も頻繁に使用されます。領域は正方形または長方形であるか、任意の形状がある場合があります。このデータ構造は、1974年にRaphael FinkelとJL BentleyによってQuadtreeと名付けられました。同様のパーティションはQツリーとしても知られています。すべての形式のQuadtreeは、いくつかの共通の機能を共有しています。

  • 彼らはスペースを適応可能な細胞に分解します
  • 各セル(またはバケット)には最大容量があります。最大容量に達すると、バケットが分割されます
  • ツリーディレクトリは、クワッドツリーの空間分解に従います
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top