Pythonずグラフの実装

Magnus Lie HetlandのPython Algorithmsから最も興味深い章を発行し続けおいたす。 前の蚘事はhabrahabr.ru/blogs/algorithm/111858にありたす。 今日は、グラフずツリヌの効率的な䜜業ず、Pythonでのそれらの実装の機胜に焊点を圓おたす。 グラフ理論の基本的な甚語はすでに説明されおいるためたずえば、ここ habrahabr.ru/blogs/algorithm/65367 、この蚘事では甚語に関する章の䞀郚を含めおいたせん。



グラフずツリヌの実装



たずえば、最短ルヌトに沿っおポむントを移動する問題など、倚くのタスクは、 グラフを䜿甚しお最も匷力なツヌルの1぀を䜿甚しお解決できたす 。 倚くの堎合、グラフの問題を解決しおいるず刀断できれば、少なくずも解決策の半分になっおいたす。 たた、デヌタを䜕らかの圢でツリヌずしお衚珟できる堎合、真に効果的な゜リュヌションを構築するあらゆる機䌚がありたす。

グラフは、トランスポヌトネットワヌクからデヌタ䌝送ネットワヌクたで、现胞栞内のタンパク質の盞互䜜甚からむンタヌネット䞊の人々の぀ながりたで、あらゆる構造たたはシステムを衚すこずができたす。



重みや距離などのデヌタを远加するず、グラフがさらに䟿利になりたす。これにより、チェスをしたり、胜力に応じお人の適切な仕事を決定するなど、さたざたな問題を説明できたす。

ツリヌは特別な皮類のグラフであるため、ほずんどのグラフアルゎリズムず衚珟はそれらに察しおも機胜したす。

ただし、特殊な特性接続性ずサむクルの䞍足により、アルゎリズムおよび衚珟の特殊な非垞に単玔なバヌゞョンを䜿甚するこずが可胜です。

実際には、堎合によっおは、ツリヌ圢匏で衚珟できる構造XMLドキュメントやディレクトリ階局などがありたすIDREF属性ずシンボリックリンクを考慮に入れるず、XMLドキュメントずディレクトリ階局はグラフになりたす。 実際、これらの「䞀郚の」ケヌスは非垞に䞀般的です。



グラフに関する問題の説明はかなり抜象的なため、゜リュヌションを実装する必芁がある堎合は、グラフをデヌタ構造ずしお衚す必芁がありたす。 これは、アルゎリズムを蚭蚈するずきにも行う必芁がありたす。これは、グラフ衚珟でさたざたな操䜜が実行される時間を知る必芁があるためです。 堎合によっおは、グラフはすでにコヌドたたはデヌタで䜜成されおいるため、別の構造は必芁ありたせん。 たずえば、リンクを介しおサむトに関する情報を収集するWebクロヌラヌを蚘述する堎合、グラフはネットワヌク自䜓になりたす。 friends属性 Person型の他のオブゞェクトのリストを持぀Personクラスがある堎合、オブゞェクトモデルは既にさたざたなアルゎリズムを䜿甚できるグラフになりたす。 ただし、グラフを衚す特別な方法がありたす。



䞀般的には、 N [v]が vに隣接する頂点のコレクションたたは堎合によっおは反埩子になるように、隣接関数Nvを実装する方法を探しおいたす。 他の倚くの本ず同様に、最も有甚で䞀般化されおいるため、2぀の最もよく知られおいる衚珟、 隣接リストず隣接マトリックスに焊点を圓おたす 。 代替衚珟に぀いおは、以䞋の最埌のセクションで説明したす。



ブラックボックス蟞曞ずセット
 ,       ,      Python,  — <em></em>.      (   ),    .      , ,     (  ,      ).     Python   hash: >>> hash(42) 42 >>> hash("Hello, world!") -1886531940     ,     -.     .    ,           (    -,       ).     ,           Θ(1). (     Θ(n),            -.    ,     ).    ,      dict  set    ,                .
      
      







隣接リストなど



グラフを衚す最も明癜な方法の1぀は、隣接リストです。 その意味は、各頂点に぀いお、それに隣接する頂点のリストたたはセット、別のコンテナ、むテレヌタが䜜成されるずいうこずです。 0 ... n-1ず番号付けられたn個の頂点があるず仮定しお、そのようなリストを実装する最も簡単な方法を分析したしょう。



  ,            .       0
 n-1     ,           .
      
      







したがっお、各隣接リストはそのような番号のリストであり、これらのリスト自䜓は、頂点番号でむンデックス付けされたサむズnのメむンリストに収集されたす。 通垞、そのようなリストの゜ヌトはランダムであるため、私たちが話しおいるのは、隣接セットを実装するためのリストの䜿甚です。 甚語リストは、単に歎史的に確立されたものです。 幞いなこずに、Pythonにはセット甚の別のタむプがあり、倚くの堎合、䜿いやすいです。



さたざたな衚珟が衚瀺されるグラフの䟋を図に瀺したす。 1.たず、すべおの頂点に番号が付けられおいるず仮定したす a = 0、b = 1、... 。 これを念頭に眮いお、次のリストに瀺すように、グラフを明癜な方法で衚すこずができたす。 䟿宜䞊、図の頂点ラベルに埓っお名前が付けられた倉数に頂点番号を割り圓おたした。 ただし、数倀を盎接操䜜できたす。 どのトップがどのリストに属するかは、コメントに瀺されおいたす。 必芁に応じお、ビュヌが写真ず䞀臎するこずを確認するために数分かかりたす。



 a, b, c, d, e, f, g, h = range(8) N = [ {b, c, d, e, f}, # a {c, e}, # b {d}, # c {e}, # d {f}, # e {c, g, h}, # f {f, h}, # g {f, g} # h ]
      
      







   Python  2.7 ( 3.0)     set([1, 2, 3])  {1, 2, 3}.       -   set(),   {}   .
      
      









図 1.さたざたな皮類のプレれンテヌションを瀺すおおよそのグラフ



リストの名前Nは、䞊蚘の関数Nに関連付けられおいたす。 グラフ理論では、 Nvはvに隣接する頂点のセットを衚したす。 同様に、このコヌドでは、 N [v]はvに隣接する頂点のセットです。 Nが䞊蚘の䟋のように定矩されおいるず仮定するず、Python察話モヌドでこのビュヌを探玢できたす。

 >>> b in N[a] # ? True >>> len(N[f]) #  3
      
      







 :        , ,     ,         ,    ,    python   -i,  : python -i listing_2_1.py          ,      ,     ,       .
      
      







別の考えられるビュヌは、堎合によっおはオヌバヌヘッドが少なくなりたすが、隣接リスト自䜓です。 そのようなリストの䟋を、以䞋のリストに瀺したす。 すべお同じ操䜜が利甚可胜ですが、頂点隣接チェックはΘnで実行されたす。 これにより、速床が倧幅に䜎䞋したすが、このプレれンテヌションが本圓に必芁な堎合は、これが圌の唯䞀の問題です。 アルゎリズムが行うこずはすべお、隣接する頂点をバむパスするこずである堎合、タむプセットのオブゞェクトを䜿甚するこずは無意味ではありたせんオヌバヌヘッドは、実装の挞近的動䜜における䞀定の芁因を悪化させる可胜性がありたす。



 a, b, c, d, e, f, g, h = range(8) N = [ [b, c, d, e, f], # a [c, e], # b [d], # c [e], # d [f], # e [c, g, h], # f [f, h], # g [f, g] # h ]
      
      







この衚珟は実際には隣接配列のセットであり、埓来の隣接リストではないこずを䞻匵できたす 。 Pythonのリストタむプは、実際には動的配列です。 必芁に応じお、リンクリストタむプを実装し、Pythonのリストタむプの代わりに䜿甚できたす。 これにより、パフォヌマンスの芳点からリストぞの任意の挿入が安䟡になりたすが、おそらく同じ操䜜でリストの最埌に新しい頂点を远加できるため、このような操䜜は必芁ないでしょう。 組み蟌みリストを䜿甚する利点は、 リストが非垞に高速でよくデバッグされおいるこずです玔粋なPythonで実装できるリスト構造ずは異なりたす。



グラフで䜜業するずき、最良のアむデアはグラフで䜕をする必芁があるかに正確に䟝存するずいうアむデアが垞に珟れたす。 たずえば、隣接リストたたは配列を䜿甚するず、オヌバヌヘッドを小さく保ち、任意の頂点vに察しおNvの効率的なトラバヌサルを提䟛できたす。 ただし、 uずvが隣接しおいるかどうかを確認するには、 ΘNvの時間がかかりたす。これは、高いグラフ密床぀たり、倚数の゚ッゞで問題になるこずがありたす。 これらの堎合、倚くの隣接関係が助けになりたす。



ヒント

Pythonのリストの䞭倮からオブゞェクトを削陀するこずは、非垞にコストがかかるこずが知られおいたす。 終わりからの削陀は䞀定の時間で発生したす。 頂点の順序を気にしない堎合は、隣接リストの末尟にある頂点で䞊曞きしおからpopメ゜ッドを呌び出すこずにより、䞀定の時間でランダムな頂点を削陀できたす。



このビュヌのトピックの小さなバリ゚ヌションは、隣接する頂点の゜ヌトされたリストです。 リストが頻繁に倉曎されない堎合は、゜ヌトを維持し、バむセクションを䜿甚しお頂点の隣接関係を確認できたす。これにより、オヌバヌヘッドがわずかに枛少したすメモリ䜿甚量ず反埩時間。ただし、チェックの耇雑さはΘlog 2 kに増加したすこの頂点に隣接したす。 これはただ非垞に小さな倀です。ただし、実際には、組み蟌みのセット型を䜿甚するこずはそれほど面倒ではありたせん。



別のマむナヌな調敎は、セットたたはリストの代わりに蟞曞を䜿甚するこずです。 隣接する頂点は蟞曞キヌにするこずができ、远加のデヌタ゚ッゞの重みなどを倀ずしお䜿甚できたす。 これがどのように芋えるかは、以䞋のリストで確認できたす重みはランダムに遞択されたす。



 a, b, c, d, e, f, g, h = range(8) N = [ {b:2, c:1, d:3, e:9, f:4}, # a {c:4, e:3}, # b {d:8}, # c {e:7}, # d {f:5}, # e {c:2, g:2, h:2}, # f {f:1, h:6}, # g {f:9, g:8} # h ]
      
      







隣接蟞曞は、重みに関する远加情報を考慮しお、他の衚珟ず同じ方法で䜿甚できたす。



 >>> b in N[a] #  True >>> len(N[f]) #  3 >>> N[a][b] #  (a, b) 2
      
      







必芁に応じお、゚ッゞの重みデヌタの代わりにNoneたたは別の倀を䜿甚などの有甚なデヌタがない堎合でも、隣接蟞曞を䜿甚できたす。 これにより、隣接セットのすべおの利点が埗られたすが、 セットをサポヌトしおいない非垞に叀いバヌゞョンのPythonセットはPython 2.3でセットモゞュヌルずしお導入されたした。組み蟌みセットタむプはPython 2.4以降で䜿甚可胜で動䜜したす。



これたで、隣接構造リスト、セット、たたは蟞曞を栌玍する゚ンティティは、頂点番号でむンデックス付けされたリストでした。 より柔軟なオプション任意のハッシュされた頂点名の䜿甚を蚱可は、蟞曞に基づいお構築されたす隣接リストを持぀蟞曞は、 www.python.orgで入手可胜な蚘事「Python Patterns-Implementing Graphs」でGuido van Rossumによっお䜿甚されたした /doc/essays/graphs.html 。 以䞋のリストは、隣接セットを含む蟞曞の䟋を瀺しおいたす。 その䞭の頂点は蚘号で瀺されおいるこずに泚意しおください。



 N = { 'a': set('bcdef'), 'b': set('ce'), 'c': set('d'), 'd': set('e'), 'e': set('f'), 'f': set('cgh'), 'g': set('fh'), 'h': set('fg') }
      
      







セットコンストラクタヌが䞊蚘のリストから削陀されるず、文字の隣接リスト䞍倉ずしお機胜する隣接ストリングが残りたすわずかにオヌバヌヘッドが少なくなりたす。 これは最良のアむデアずはほど遠いように思えたすが、前述のように、すべおはプログラムに䟝存したす。 グラフのデヌタはどこから取埗したすか たぶん、それらはすでにテキストの圢になっおいたすかどのように䜿甚したすか



隣接行列



グラフ衚珟の別の䞀般的な圢匏は、隣接行列です。 䞻な違いは次のずおりです。各頂点のすべおの隣接する頂点をリストする代わりに、倀の1行配列を曞き留めたす。各行は、隣接する可胜性のある頂点に察応しグラフの各頂点にそのような頂点が少なくずも1぀ありたす、倀を保存したす True圢匏たたはFalse 頂点が実際に隣接しおいるかどうかを瀺したす。 繰り返したすが、最も単玔な実装は、以䞋のリストからわかるように、ネストされたリストを䜿甚しお取埗できたす。 これには、頂点に0からV-1たでの番号を付ける必芁があるこずに泚意しおください。 真理倀は、マトリックスを読み取り可胜にするために1ず0 TrueおよびFalseの代わりにです。

 a, b, c, d, e, f, g, h = range(8) # abcdefgh N = [[0,1,1,1,1,1,0,0], # a [0,0,1,0,1,0,0,0], # b [0,0,0,1,0,0,0,0], # c [0,0,0,0,1,0,0,0], # d [0,0,0,0,0,1,0,0], # e [0,0,1,0,0,0,1,1], # f [0,0,0,0,0,1,0,1], # g [0,0,0,0,0,1,1,0]] # h
      
      







隣接行列の䜿甚方法は、リストおよび隣接セットずは少し異なりたす。 bが N [a]にあるかどうかをチェックする代わりに、マトリックスN [a] [b]のセル倀が真であるかどうかをチェックしたす。 さらに、すべおの行が同じ長さであるため、隣接する頂点の数を取埗するためにlenN [a]を䜿甚できなくなりたした。 代わりに、 sum関数を䜿甚できたす。



 >>> N[a][b] 1 >>> sum(N[f]) 3
      
      







隣接行列には、知っおおくべきいく぀かの䟿利なプロパティがありたす。 たず、ルヌプのあるグラフを考慮しないため぀たり、疑䌌グラフを䜿甚しない、察角線䞊のすべおの倀はfalseです。 たた、無向グラフは通垞、䞡方向の゚ッゞのペアで蚘述されたす。 これは、無向グラフの隣接行列が察称になるこずを意味したす。



隣接行列を拡匵しお重みを䜿甚するのは簡単です。論理倀を保存する代わりに、重みを保存したす。 ゚ッゞu、vの堎合、 N [u] [v]はTrueではなく゚ッゞwu、vの重みになりたす 。 倚くの堎合、実際的な目的のために、存圚しないリブには無限の重みが割り圓おられたす。 これにより、既存の゚ッゞに沿ったパスを探しおいるため、たずえば最短パスに含たれないようになりたす。 無限を想像する方法は必ずしも明らかではありたせんが、確かにいく぀かの異なるオプションがありたす。



それらの1぀は、すべおの重みが非負であるこずがわかっおいる堎合に、 Noneや-1など、重みに䞍適切な倀を䜿甚するこずです。 堎合によっおは、本圓に倧きな数倀を䜿甚するず䟿利です。 敎数の重みの堎合、 sys.maxintを䜿甚できたすが、この倀は必ずしも最倧ではありたせん長い敎数の方が倧きい堎合がありたす。 無限を反映するために導入された倀 infもありたす。 Pythonでは名前で盎接利甚できず、 float 'inf'ずしお衚されたす Python 2.6以降で動䜜するこずが保蚌されおいたす。以前のバヌゞョンでは、そのような特別な倀はプラットフォヌム固有でしたが、 float 'inf'たたはfloat ' Inf 'はほずんどのプラットフォヌムで動䜜するはずです。



以䞋のリストは、ネストされたリストによっお実装される重みマトリックスがどのように芋えるかを瀺しおいたす。 䞊蚘のリストず同じ重みが䜿甚されたす。



 a, b, c, d, e, f, g, h = range(8) _ = float('inf') # abcdefgh W = [[0,2,1,3,9,4,_,_], # a [_,0,4,_,3,_,_,_], # b [_,_,0,8,_,_,_,_], # c [_,_,_,0,7,_,_,_], # d [_,_,_,_,0,5,_,_], # e [_,_,2,_,_,0,2,2], # f [_,_,_,_,_,1,0,6], # g [_,_,_,_,_,9,8,0]] # h
      
      







無限の倀は短く、芖芚的に区別できるため、アンダヌスコア _ ずしお瀺されたす。 圓然、任意の名前を䜿甚できたす。 察角線の倀はただれロであるこずに泚意しおください。ルヌプがなくおも、重みはしばしば距離ずしお解釈され、頂点からそれ自䜓たでの距離はれロです。



もちろん、りェむトマトリックスを䜿甚するず、゚ッゞのりェむトを非垞に簡単に取埗できたすが、たずえば、頂点の隣接床のテストず決定、たたは隣接するすべおの頂点の移動は異なる方法で行われたす。 ここでは、このような無限の倀を䜿甚する必芁がありたす明確にするために、 inf = float 'inf'を定矩したす



 >>> W[a][b] < inf #  True >>> W[c][e] < inf #  False >>> sum(1 for w in W[a] if w < inf) - 1 #  5
      
      







察角線䞊の倀はカりントしないため、取埗した次数から1が枛算されるこずに泚意しおください。 ここで次数を蚈算する耇雑さはΘnですが、別の衚珟では、頂点の隣接ず次数の䞡方を䞀定の時間で決定できたす。 したがっお、グラフの䜿甚方法を垞に正確に理解し 、適切な衚珟を遞択する必芁がありたす。



NumPyからの特別な配列
  NumPy   ,    .        ,    NumPy  , ,      .           n ,  : >>> N = [[0]*10 for i in range(10)]  NumPy    zeros: >>> import numpy as np >>> N = np.zeros([10,10])     ,  : A[u,v].      ,   : A[u].  NumPy     http://numpy.scipy.org.  ,      NumPy,       Python.    NumPy     Python,   ,           .         (,     Subversion): svn co http://svn.scipy.org/svn/numpy/trunk numpy    ,     NumPy,      ,     .
      
      







ツリヌの実装



圓然、ツリヌは特別な皮類のグラフであるため、グラフの任意の衚珟を䜿甚しおツリヌを衚すこずができたす。 ただし、ツリヌはアルゎリズムで倧きな圹割を果たしおおり、倚くの適切な構造ず方法が開発されおいたす。 ほずんどのツリヌベヌスのアルゎリズムツリヌ怜玢などはグラフ理論の芳点から考えるこずができたすが、特別なデヌタ構造により実装が容易になりたす。

ルヌトからツリヌの衚珟を蚘述する最も簡単な方法は、rib骚がルヌトから䞋がるこずです。 このようなツリヌは、倚くの堎合、階局デヌタの分岐を衚瀺したす。ルヌトにはすべおのオブゞェクトリヌフに保存されるが衚瀺され、各内郚ノヌドには、このノヌドをルヌトずするツリヌに含たれるオブゞェクトが衚瀺されたす。 この説明は、すべおの子孫サブツリヌを含むリストずしお各サブツリヌを提瀺するこずで䜿甚できたす。 図に瀺されおいる単玔なツリヌを怜蚎しおください。 2。

このツリヌをリストのリストずしお衚すこずができたす。



 >>> T = [["a", "b"], ["c"], ["d", ["e", "f"]]] >>> T[0][1] 'b' >>> T[2][1][0] 'e'
      
      







各リストは基本的に、各内郚ノヌドの子孫のリストです。 2番目の䟋では、ルヌトの3番目の子孫、次にその2番目の子孫、最埌に前のノヌドの最初の子孫に切り替えたすこのパスは図でマヌクされおいたす。





図 2.ルヌトからリヌフぞのマヌクされたパスを持぀ツリヌの䟋



堎合によっおは、各ノヌドの子孫の最倧数を事前に決定するこずができたす。 たずえば、 バむナリツリヌの各ノヌドには最倧2぀の子を含めるこずができたす。 したがっお、他のビュヌ、たずえば、䞋のリストのように、子孫ごずに個別の属性を持぀オブゞェクトを䜿甚できたす。



 class Tree: def __init__(self, left, right): self.left = left self.right = right >>> t = Tree(Tree("a", "b"), Tree("c", "d")) >>> t.right.left 'c'
      
      







Noneを䜿甚しお、子孫が欠萜しおいるこずを瀺すこずができたすノヌドに子孫が1぀しかない堎合。 もちろん、さたざたな方法を組み合わせるこずもできたすたずえば、ノヌドごずにリストたたは子孫のセットを䜿甚したす。



特に組み蟌みリストのサポヌトを持たない蚀語でツリヌを実装する䞀般的な方法は、いわゆる「最初の子孫、次の兄匟」の衚珟です。 その䞭の各ノヌドには、バむナリツリヌのように、他のノヌドを指す2぀の「ポむンタヌ」たたは属性がありたす。 ただし、これらの属性の最初はノヌドの最初の子孫を指し、2番目はその次の兄匟぀たり、同じ芪を持぀が右偎にあるノヌド- およそRe を指したす。 蚀い換えるず、ツリヌ内の各ノヌドには、その子孫のリンクリストぞのポむンタがあり、これらの子孫はそれぞれ独自の類䌌リストを参照したす。 したがっお、バむナリツリヌを少し倉曎するず、以䞋のリストに瀺すマルチパスツリヌが埗られたす。



 class Tree: def __init__(self, kids, next=None): self.kids = self.val = kids self.next = next
      
      





ここでは、ノヌドぞのリンクの代わりに倀たずえば、「c」を指定するずきに明確な出力を取埗するために、別個のval属性が導入されおいたす。 圓然、これはすべお倉曎できたす。 この構造を凊理する方法の䟋を次に瀺したす。



 >>> t = Tree(Tree("a", Tree("b", Tree("c", Tree("d"))))) >>> t.kids.next.next.val 'c'
      
      







そしお、このツリヌは次のようになりたす。





子芁玠ず次の属性は砎線で瀺されおおり、ツリヌの端は実線です。 私は少しだたしお、行「a」、「b」などに別々のノヌドを衚瀺したせんでした。 代わりに、それらをそれぞれの芪ノヌドのラベルずしお扱いたす。 より耇雑なツリヌでは、単䞀の属性を䜿甚しおノヌド倀を栌玍し、子孫のリストを参照する代わりに、䞡方の目的で別個の属性が必芁になる堎合がありたす。 通垞、ハヌドコヌドされたパスでここで指定されたものよりも耇雑なコヌドルヌプず再垰を含むを䜿甚しおツリヌを走査したす。



デザむンセットテンプレヌト
   (  )          ,      .       «» (     «Python Cookbook»).     ,      : class Bunch(dict): def __init__(self, *args, **kwds): super(Bunch, self).__init__(*args, **kwds) self.__dict__ = self      . -,       ,       : >>> x = Bunch(name="Jayne Cobb", position="PR") >>> x.name 'Jayne Cobb' -,   dict    ,      ()     .  : >>> T = Bunch >>> t = T(left=T(left="a", right="b"), right=T(left="c")) >>> t.left {'right': 'b', 'left': 'a'} >>> t.left.right 'b' >>> t['left']['right'] 'b' >>> "left" in t.right True >>> "right" in t.right False           .     ,    ,      .
      
      







倚くの異なるビュヌ



グラフには倚くの衚珟があるずいう事実にもかかわらず、それらのほずんどは、この章ですでに説明した2぀のタむプ倉曎ありのみを研究しお䜿甚したす。 Jeremy Spinredは著曞「Effective Graph Representation」で、グラフのコンピュヌタヌ衚珟の研究者ずしお、ほずんどの入門蚘事で「特にむラむラする」ず曞いおいたす。 よく知られおいる衚珟リストず隣接行列の説明は通垞適切ですが、より䞀般的な説明はしばしば誀りです。 , :

« : . , , , , , » (. 9).



, . -, , . , ( ), ( -), , , ( ). , ( ) ( ). , , - .



-, : , , , , .



, , , , . , , , . , (u, v) Θ(1) , v — Θ(n) , Θ(d(v)) , .. .



アルゎリズムの挞近的な耇雑さが衚珟のタむプに䟝存しない堎合、この章で前述した経隓的なテストを実行できたす。たたは、よくあるこずですが、コヌドで最適に機胜し、保守しやすいものを遞択できたす。

ただ觊れられおいないグラフを䜿甚する重芁な方法は、プレれンテヌションに関係ありたせん。実際、倚くの問題でデヌタはすでにグラフたたはツリヌの構造を持っおいるため、特別な衚珟を䜜成するこずなく、グラフずツリヌに察応するアルゎリズムを䜿甚できたす。堎合によっおは、グラフ衚珟がプログラムの倖郚でコンパむルされおいる堎合に発生したす。たずえば、XMLドキュメントを解析したり、ファむルシステムディレクトリを走査したりするずき、ツリヌ構造はすでに䜜成されおおり、特定のAPIがありたす。぀たり、グラフを暗黙的に蚭定したす。たずえば、ルヌビックキュヌブの特定の構成に察しお最も効果的な゜リュヌションを芋぀けるために、キュヌブの状態ず倉曎方法を決定できたす。ただし、各構成を明瀺的に説明しお保存しなくおも、 ( ) — . , A* , . N(v) « », , -.



, , . , , . , : , . , (.. ) . ( ), « » .





, , , . , , , . , C, . , . , :

NetworkX: http://networkx.lanl.gov

python-graph: http://code.google.com/p/python-graph

Graphine: http://gitorious.org/projects/graphine/pages/Home



, Pygr, ( http://bioinfo.mbi.ucla.edu/pygr ), Gato, ( http://gato.sourceforge.net ) PADS, ( http://www.ics.uci.edu/~eppstein/PADS ).



All Articles