Pythonの基本的なプログラミング:図Pythonのデータ構造を幅優先と深さ第1の実施の説明

この記事では、図のPythonの幅優先と深さ優先使用の例示的なデータ構造を記述する。ご参考のためにあなたに共有します。次のとおりです。

まず、概念があります:バック

バックトラック(探査とバックトラック)が最適な選択の検索で、私たちの目標を達成するためには、良好な状態にプレスを前方に検索します。しかし、探索するステップは、オリジナルの選択が優れていないか、その目標を達成するために発見したときに、それが再選択し、この死者バックトラックの戻り歩行技術の端、およびいくつかの点状態条件での素敵なバックにステップバックでいわゆる「バックトラックポイント。」

深さ優先アルゴリズム:

(1)初期アクセスタグ頂点と頂点v vが訪れました。
(2)頂点v wの最初の隣接頂点を見つけます。
頂点v wの隣接する頂点が存在する場合(3)は、それが継続し、そうでない場合、バックVに、他の未訪問の隣人は、Vを見つけます。
(4)W頂点はまだ、アクセスW頂点と訪問としてマークW頂点アクセスされた場合。
(5)工程(3)〜vの値場合WI、WI、W次の隣接する頂点の頂点を見つけるために続け。すべてのすべての頂点までの図の通信は、これまでに訪れました。

幅優先アルゴリズム:

(1)は、頂点vをキューイングします。
(2)キューが継続空されていない、そうでなければ、アルゴリズムは終了します。
(3)キューヘッドチームポイントを得るためにV、V訪問頂点と頂点vマークがアクセスされました。
(4)は、頂点v COLの最初の隣接頂点を見つけます。
隣接する頂点のV COLは、キューCOLアクセスされていない場合は(5)。
(6)は、ステップ(5)に行き、別の新しい頂点vの隣接頂点COLを探し続けています。すべてのネイバーが訪問されていないまで、頂点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をお勧めし、[]を入力しますここでは、経験、研究ノートを学ぶ前に、私のコレクションです、ビジネス経験の機会があり、実際のプロジェクトデータに基づいてゼロに沈静化し、私たちは一番下に、メッセージを残すことができ、前方に置くことを知っていない、我々は進歩を一緒に勉強します

公開された25元の記事 ウォン称賛7 ビュー30000 +

おすすめ

転載: blog.csdn.net/haoxun11/article/details/104953679