파이썬 기본적인 프로그래밍 :도 파이썬 데이터 구조가 너비 우선 깊이 우선 예제 설명

이 문서는도 파이썬 너비 우선 깊이 우선 사용의 예시 데이터 구조를 설명한다. 참조 용으로 공유 할 수 있습니다. 으로는 다음과 같습니다 :

첫째, 개념이있다 : 다시

(탐사 및 역 추적)를 역 추적하는 것은 우리의 목표를 달성하기 위해, 우수한 상태로 눌러 앞으로 검색, 최적의 선택 검색입니다. 단계가 탐험 때, 원래의 선택이 목표를 달성하기 위해 또는 우수하지 않습니다 발견, 그것은에 스텝 돌아, 역 추적에 대한 반환 도보 기술에 대한이 막 다른 골목을 다시 선택하고 어떤 점 상태의 조건에서 만나 다시 "역 추적 점"이라고합니다.

깊이 우선 알고리즘 :

(1) 초기 접속 태그 정점과 정점 V V를 방문했다.
(2) w 정점 (V)의 제 1 인접 꼭지점을 발견한다.
정점 V w 인접한 정점, 그것은 계속 존재하는 경우 (3), 그렇지 않으면 다시 V에, 다른 방문하지 않은 이웃은 V를 찾을 수 있습니다.
(4) 만약 아직 읽혔 승 정점 w 및 방문으로 표시된 정점 w 액세스 정점.
(5) 다음의 인접한 꼭지점 위스콘신, 정점 w, WI를 찾는 계속되면 단계 (3) 내지 (V)의 값. 모두의 모든 정점까지도 통신은 지금까지 방문했다.

폭 우선 알고리즘 :

(1)의 정점 (V)를 큐.
(2) 큐가 계속 다음 비어 있지, 그렇지 않으면 알고리즘 종료됩니다.
(3)는 큐 헤드 팀 점 (V)을 수득하는 단계; V 방문 정점과 정점 v 표시가 읽혔.
(4)의 정점 브이 COL의 제 1 인접 꼭지점을 발견한다.
(5) 인접 정점 COL V 액세스되지 않으면 큐 내지 컬럼.
(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]
마지막으로, 우리는 매우 넓은 파이썬 학습 자원 수집을 추천, []를 입력합니다 여기, 경험, 연구 노트, 사업 경험의 기회가 학습하기 전에 내 컬렉션이 있고, 실제 프로젝트 데이터를 기준으로 제로로 진정, 우리는 아래에, 앞으로 넣어 모르는 메시지를 남길 수 있습니다 우리는 진행 상황을 함께 공부합니다

게시 25 개 원래 기사 · 원 찬양 7 ·은 30000 +를 볼

추천

출처blog.csdn.net/haoxun11/article/details/104953679