2016-05-13 6 views
1

グラフの実装方法はhttps://www.python.org/doc/essays/graphs/です。問題は、あるノードへのすべての着信アークをできるだけ速く見つける方法を混乱させることです。この単純なグラフで、あるノードの到来するアーク/エッジをすべて見つける方法を教えてください。

graph = {'A': ['B', 'C'], 
      'B': ['C', 'D'], 
      'C': ['D'], 
      'D': ['C'], 
      'E': ['F'], 
      'F': ['C']} 

ノードCには、ノードA、B、D、Fからのアークがあることがわかります。問題は、どのようにしてノードA、B、D、Fをキーの辞書の各リストに入れずにチェックして、Cが含まれているかを調べる方法です。これを行う方法や効率的なグラフとメソッドがありますか?誰かが正しい方向に私を向けることができます、事前に感謝します。

+0

問題の正しいデータ構造は、隣接リストではなく、*隣接行列*です。私は有向グラフを「入射行列」といいます。特定のアークをチェックする方が効率的ですが、スペースが効率的ではありません。特にスパースグラフの方が効率的です。 –

+0

@machineyearningあなたは、Pythonの隣接行列を教えるサイトを知っていますか、それを共有できる実装ですか?それは本当に助けになるでしょう、事前に感謝します。また、隣接行列との違いは隣接リストと何が違うのでしょうか? – DST

+0

隣接リストを 'set'データ構造として実装することで、パフォーマンスを向上させることもできます。次に、あなたが '' pointsToTo''のようなset membershipをgraph.items()内のpointsFrom、pointsToのようにチェックすることができます。これは、nをグラフのノード数とすると、order-nのパフォーマンスが得られます。 –

答えて

1

あなたは、あなたが同じようtargetにノードのインシデントを確認することができ、単にset構造

graph = {'A': {'B', 'C'}, # If you're using python 2.7+ you can initalize a set like this 
     'B': {'C', 'D'}, 
     'C': {'D'}, 
     'D': {'C'}, 
     'E': set(['F']), # Set initialization pre-2.7 
     'F': set()}  # Empty set initialization, can't use {} 

を使用して隣接行列に似た何かを得ることができます。

[pointsFrom for (pointsFrom, pointsTo) in graph.items() if target in pointsTo] 

これは、実行中の時間を持つことになりますあなたのグラフのノード数で線形です。

+0

graph.items()内のpointsFrom(pointsFrom、pointsTo)のための '[pointsTo]が' 'pointsTo]'の中でどう働くかを説明できますか?私はセットがセット内の要素を比較することを許していることを知っていますが、このコードは事前に感謝の言葉で働いています。 – DST

+0

これは、[list comprehension](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)と呼ばれる、Pythonでよく知られている構文です。基本的には、リストを宣言し、何かを反復し、要素をフィルタリングし、宣言されたリストにそれらを追加する前に変換します。 graph.items()内の 'for each(pointsFrom、pointsTo)のペアのように読むことができます。ターゲットがpointsToに設定されている場合は、ポイントを私の結果リストに置きます。これらの式は**超便利**であり、リスト、辞書、または任意の種類の反復可能な構造を作成するために使用できます。 –

+0

一般的に、これは(Generator Expression)[https://www.python.org/dev/peps/pep-0289/]と呼ばれ、メモリを占有しないイテラブルを生成し、 iterableを消費するいくつかの関数に時間と 'yield 'を与えます。たとえば、 'list'コンストラクタでラップすると' dict'や 'set'コンストラクタと同じ' list'が得られます。これらを勉強し、それらを使用して練習すれば、コードをきれいに保つのに役立ち、非常に効率的で慣用的です。 (編集:私はリンクのマークダウンが上で動作していない理由を知らない) –

関連する問題