2

問題: 2 つのネットワーク ファイル (たとえば、NET1 と NET2) があります。それぞれに、各ノードの一意の ID と地理座標 X と Y を持つ一連のノードがあります。NET2 の各ノードには、 NET1 へのn接続と ID n 個のノードは、最小直線距離によって決定されます。出力には、NET1、NET2 のノードの 3 つのフィールド ID、およびそれらの間の距離が含まれます。すべてのファイルはタブ区切り形式です。

これを実装する 1 つの方法 は、NET2 の各ノードに対して、NET1 の各ノードをループし、すべての NET1-NET2 距離の組み合わせを計算することです。NET2 ノード ID と距離で並べ替え、各ノードの最初の 4 つのレコードを書き出します。しかし問題は、NET1 に 200 万近くのノード、NET2 に 2000 のノードがあることです。これは、このアルゴリズムの最初のステップで 40 億の距離を計算して書き込む必要があることです...そしてランタイムは非常に厳しいものです!

リクエスト: 同じような問題に直面した人がいるかどうか知りたいです。処理を高速化するために使用できるアルゴリズムとデータ構造について皆さんから聞いてみたいです。この質問の範囲が非常に広いことは知っていますが、この規模のデータのコードを最適化する経験が非常に限られているため、誰かが正しい方法を教えてくれることを願っています.

言語: C++、Python、R で試しています。

アイデアをどんどん出してください!大変助かります!

4

1 に答える 1

1

kd-treeはオプションの1つです。これにより、妥当な時間内に最近傍(または最近傍のセット)を見つけることができます。もちろん、最初にツリーを構築する必要があり、時間がかかります。ただし、実行時にノードを追加/削除する必要がない場合は、一般的にkd-treeが適しています。これはあなたの場合のようです。また、寸法が小さいほどパフォーマンスが向上します(この場合、寸法は2です)。

もう1つの可能なデータ構造はoctree( 2Dのクアッドツリー)です。これはより単純なデータ構造(実装が非常に簡単)ですが、kd-treeの方が効率的です。

于 2013-03-09T15:47:13.563 に答える