Pythonデータ構造グラフの深さ優先と幅優先の例

@この記事は公開番号から来ています:csdn2299、公開番号プログラマアカデミーに注目したい
この記事では、Pythonデータ構造のグラフの深さ優先と幅優先の使用法について説明します。参考までに共有してください。詳細は次のとおりです。

最初にコンセプトがあります:バックトラック

バックトラッキング方式(探索とバックトラッキング方式)は最適な検索方式であり、最適な条件に従って前方に検索して目標を達成します。ただし、特定のステップを探索すると、元の選択が適切でないか、目標に達していないことが判明し、1つのステップが返されて再選択されます。この戻りに失敗してから失敗するこの手法は、バックトラック方法であり、バックトラック条件を満たす特定の状態のポイントです。これは「バックトラックポイント」と呼ばれます。

深さ優先アルゴリズム:

(1)最初の頂点vを訪問し、頂点vが訪問されたことをマークします。
(2)頂点vの最初の隣接する頂点wを見つける。
(3)頂点vの隣接する頂点wが存在する場合は実行を継続し、そうでない場合はvに戻ってvの未訪問の別の隣接点を見つけます。
(4)頂点wにまだアクセスしていない場合は、頂点wにアクセスし、頂点wを訪問済みとしてマークします。
(5)頂点wの次の隣接頂点wiの検索を続行します。vがwiの値を取る場合は、手順(3)に進みます。接続されたグラフのすべての頂点にアクセスするまで。

幅優先アルゴリズム:

(1)頂点vがキューに入ります。
(2)キューが空でない場合は実行を続け、それ以外の場合はアルゴリズムを終了します。
(3)キューから出て先頭の頂点vを取得し、頂点vにアクセスして、頂点vにアクセスしたことをマークします。
(4)頂点vの最初の隣接する頂点colを見つける。
(5)vの隣接する頂点colにアクセスしていない場合、colがエンキューされます。
(6)頂点vの別の新しい隣接頂点colを引き続き検索し、ステップ(5)に進みます。訪問されていない頂点vのすべての隣接点が処理されるまで。手順(2)に進みます。

コード:

#!/usr/bin/python
# -*- coding: utf-8 -*-
class Graph(object):
  def __init__(self,*args,**kwargs):
    self.node_neighbors = {}
    self.visited = {}
  def add_nodes(self,nodelist):
    for node in nodelist:
      self.add_node(node)
  def add_node(self,node):
    if not node in self.nodes():
      self.node_neighbors[node] = []
  def add_edge(self,edge):
    u,v = edge
    if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]):
      self.node_neighbors[u].append(v)
      if(u!=v):
        self.node_neighbors[v].append(u)
  def nodes(self):
    return self.node_neighbors.keys()
  def depth_first_search(self,root=None):
    order = []
    def dfs(node):
      self.visited[node] = True
      order.append(node)
      for n in self.node_neighbors[node]:
        if not n in self.visited:
          dfs(n)
    if root:
      dfs(root)
    for node in self.nodes():
      if not node in self.visited:
        dfs(node)
    print order
    return order
  def breadth_first_search(self,root=None):
    queue = []
    order = []
    def bfs():
      while len(queue)> 0:
        node = queue.pop(0)
        self.visited[node] = True
        for n in self.node_neighbors[node]:
          if (not n in self.visited) and (not n in queue):
            queue.append(n)
            order.append(n)
    if root:
      queue.append(root)
      order.append(root)
      bfs()
    for node in self.nodes():
      if not node in self.visited:
        queue.append(node)
        order.append(node)
        bfs()
    print order
    return order
if __name__ == '__main__':
  g = Graph()
g.add_nodes([i+1 for i in range(8)])
g.add_edge((1, 2))
g.add_edge((1, 3))
g.add_edge((2, 4))
g.add_edge((2, 5))
g.add_edge((4, 8))
g.add_edge((5, 8))
g.add_edge((3, 6))
g.add_edge((3, 7))
g.add_edge((6, 7))
print "nodes:", g.nodes()
order = g.breadth_first_search(1)
order = g.depth_first_search(1)

結果:

ノード:[1、2、3、4、5、6、7、8]

幅優先:
[ 1、2、3、4、5、6、7、8 ]

最初の深さ:

[
1、2、4、8、5、3、6、7 ] 読んでいただきありがとうございました
。大学時代自習用のpythonを選びました。働いた後、コンピュータの土台が悪いことに気づきました。教育を受けていません。これは
不可能です。 、明日の翌日しか補えないので、彼はコーディングの外側に独自の反撃の道を開き、常にPythonのコア知識、コンピュータの基礎に関する詳細な研究を学び、それを整理しました。平凡になりたくない場合は、私に参加してください。コーディングを超えて、成長を続けてください!
実は、ここには技術だけでなく、それ以外のものもあり、例えば「絹糸」というよりも、どうやってプログラマーとして絶妙な存在になるのか、プログラマー自体が高貴な存在ですね。[参加するにはクリックしてください]自分らしくなりたい、高貴な人になりたい、是非!

公開された34のオリジナル記事 いいね12 訪問者20,000以上

おすすめ

転載: blog.csdn.net/chengxun03/article/details/105476955