2016-10-14 18 views
3

min-heapを使った方法を調べました。各点について、サイズkの最小ヒープを格納することができますが、それは大きなn(1億の周りのnを対象とする)にはあまりにも多くのスペースを必要とします。確かに、より少ないスペースを利用し、時間の複雑さにそれほど影響を与えない、これを行うためのよりよい方法がなければなりません。他のデータ構造はありますか?2次元平面上のn点を考えると、各点のk個の最近傍点を見つける必要があります。

+0

**大容量の** n **は「多くのスペース」にどの程度大きな影響を与えますか?ヒープサイズは** k **ですか?あなたはデータセットのサイズについてhttps://en.wikipedia.org/wiki/K-d_treeを考えましたか? – MBo

+0

私は、メタは各ポイントごとに1つのminheapを考えていると思います。したがって、サイズが「k」の全「n」個のヒープが存在し、合計で「n * k」スペースをとる。 –

+0

@SauravSahuはい、私はそのように考えました。 – nighthowler

答えて

4

この問題は、KD-treeの一般的な設定です。そのような解は直線的な複雑さを有するが、実装するのが比較的複雑な場合がある(準備が整った実装が利用できない場合)

別の方法として、ナイーブアルゴリズムの複雑さを減らすためにバケットを使用することができる。アイデアは、平面を「バケット」、すなわちあるサイズの四角形に分割し、それらが属するバケット内にポイントを配置することです。最も近いポイントは最も近いバケットからのものです。ランダムなデータの場合、これはかなり良い改善になる可能性がありますが、最悪の場合は未知のアプローチと同じです。

+0

私はKD-Treeについて学びます。また、バケット化のアプローチもかなり良いようです。実装に適したデータ構造は何ですか?私は、二次元平面内のバケット(ノード)の間の隣接関係を表すエッジを持つグラフ上の幅広い最初の探索がかなり良いと思う。 – nighthowler

+0

私が想像している実装では、バケットごとにセルを持つ2次元行列か、ハッシュテーブル(または他の連想配列)を使うことができます。 –

関連する問題