2017-08-24 5 views
0

両方のノードが与えられたノードのリスト内にあるすべてのエッジを取得する方法を教えてください。 G.edges([list_of_nodes])は、各エッジの少なくとも1つのノードがlist_of_nodesにあるすべてのノードを返します。私はそれを望んでいない。どうすれば入手できますか?ノードリスト内のエッジを取得

+0

私はダウン投票についての手がかりを教えてください? – sovon

+0

少しヒント:「私はそれを望んでいません。どうすれば入手できますか?」また、これは:https://stackoverflow.com/help/how-to-ask – BoboDarph

+0

私は理解していません。これはそれほど控えめですか?もしそうなら、私の見解は、「私がしたいこととしたくないことを指定するためにその行を書きました。私は本当に明確にすべきだと思っていました。ありがとう – sovon

答えて

2

すでに見つかったすべてのエッジをループし、両方のノードがノードのリストにあるかどうかをテストできますが、ノードのリストが大きい場合は最適ではありません。リストに要素が含まれているかどうかを確認するには、リストを反復処理する必要があります。したがって、各エッジの平均エッジ数は2*len(list)/2です。各ノードのチェック数はlen(list)/2です。エッジの数がlen(list)に比例すると仮定すると、これには2次の時間があります。

edges = [(u,v) for u,v in G.edges(list_of_nodes) if u in list_of_nodes and v in list_of_nodes] 

より効率的な方法は、ノードがリストではなくセットに含まれているかどうかをテストします。セットは、要素が含まれているかどうかを非常に高速に確認できます。テストごとにほとんどO(1)です。したがって、完全なものは線形時間で実行されます。

set_of_nodes = set(list_of_nodes) 
edges = [(u,v) for u,v in G.edges(set_of_nodes) if u in set_of_nodes and v in set_of_nodes] 
+0

私は同じことをやっています。しかし、私は何百万というエッジを持っているため、非常に遅いです。 – sovon

+0

'list_of_nodes'ではなく' set_of_nodes'を使用していますか? – Joel

+0

私はあなたの答えの前にリストを使い始めました、それはとても遅かったです。今私はセットを使用して、それは非常に高速です。どうもありがとうございます – sovon

関連する問題