これは愚かな質問であってもよいが、のは、私は大きなを持っているとしましょうかもしれません(〜ラインの十億)の頂点のような文字列で表され隣接リスト含まれているCSVファイル:隣接リストのこれらの種類の中から巨大な隣接リストからエッジリストを抽出する最も効率的な方法は何ですか?
+------------+---------------------------+
| id | neighbors |
+------------+---------------------------+
| 'james' | 'michael, jane, pete' |
| 'doug' | 'cliff' |
| 'amy' | 'bobby, russell, richard' |
| 'richard' | 'kam, earl, cliff' |
| 'marshawn' | |
| 'bobby' | 'emily, james, doug' |
+------------+---------------------------+
を私がしたいのは、頂点セットと、の無指向のの頂点のペアで構成されるエッジセットです。それだけです。
これを達成するための最も効率的な戦略は何ですか?また、これをPythonでどのように実装しますか?以下のアルゴリズムを概説で簡潔にするために
は、ましょう:
add('bobby')
:頂点に頂点「ボビー」を追加する操作は、edge('bobby','emily')
を設定:動作(「ボビー」を追加するために、 「エミリー」)エッジへingraph('bobby')
を設定します。頂点「ボビー」は頂点であるかどうかを確認、我々が取ると
を設定空のグラフから始まり、順番に頂点を追加するアプローチ。次に、(非常に生擬似コードで)私の最初の試みは、のようになります。
ids = [...all id's in the CSV...]
unexplored = list(ids)
for i in ids:
add(i)
for j in unexplored:
if i in neighbors(j):
if not ingraph(j): add(j)
edge(i, j)
del unexplored[0]
- 一般(パイソンの独立した)に、このアルゴリズムを改善するための明確な方法はありますか?
- このようなソリューションをPythonで実装する最も良い方法は何ですか?生のCSVファイルを反復処理しますか?
pandas
にロードし、numpy
を使ってこれを何らかの形でベクトル化します(十分なメモリがあると仮定して...)。
EDIT:書き込むことにより「隣人」私はそれを明確に私は無向グラフにしたいことを確認することを望みました。申し訳ありませんが、これは明らかではない場合。
ルックアップの方が効率的であるため、リストではなくハッシュされたデータ構造を使用します。 – derM
あなたは、効率的に*(O(1))の端を問い合わせる可能性はありますか?そうでなければ、それを実装したいかもしれません。次に、リストをO(行)で処理することができます。 – derM
"グラフ"よりも具体的にする必要があります。多くの定義により、あなたの巨大なCSVファイルはすでにグラフになっています。特定のグラフ表現を作成する必要がありますか?特定の操作を効率的にサポートする必要がありますか?あなたの実際の必要条件は何ですか? – user2357112