このトピック-DFS/BFSのクリーンアップ


グラフィックナビゲーションアルゴリズム:DFS/BFS

  • 「その他の色」とは、大量のデータから所望のデータを検索するプロセス
  • を意味する.
  • 代表的なグラフィックナビゲーションアルゴリズムはDFSとBFS→頻繁出力を含む
  • スタック

  • データを先に入力後に出力データ構造
  • .
  • 入口および出口は、同じ形態でスタック
  • を可視化することができる.
    stack = []
    
    stack.append(5) 
    stack.append(2) 
    stack.append(3) 
    stack.append(7) 
    stack.pop()
    stack.append(2) 
    stack.append(2) 
    stack.pop()
    
    print(stack[::-1]) # 최상단 원소부터 출력 
    print(stack) # 최하단 원소부터 출력  

    キュー

  • 先入データ先出フォーマット(先入先出)資料構造
  • 列は入口も出口も開口したトンネルと同様にココア視化
  • from collections import deque 
    # 큐(Queue) 구현을 위해 deque 라이브러리 사용 
    queue = deque() 
    
    queue.append(5) #가장 오른쪽에 숫자 추가 
    queue.popleft() # 가장 왼쪽에 숫자 제거 
    
    print(queue) # 먼저 들어온 순서대로 출력 
    queue.reverse() # 역순으로 바꾸기 
    print(queue) # 나중에 들어온 원소부터 출력 

    さいきかんすう


  • 再帰関数とは、自分の関数を再呼び出しすることです.

  • 再帰関数を使用する際の注意点
  • 再帰関数を注意深く使用すると、複雑なアルゴリズムを簡略化できますが、他の人には理解しにくいコードになる可能性があります.
  • すべての再帰関数は、同じ機能
  • を反復文で実現することができる.
  • 再帰関数は繰り返し文に有利であり、不利文
  • もある.
  • コンピュータが関数を連続的に呼び出すと、コンピュータメモリ内部のスタックフレームに蓄積されます.→したがって、スタックを使用する必要がある場合、実装ではスタックライブラリではなく再帰関数が一般的に使用される
  • DFS(Depth-First Search)

  • DFSは深さ優先探索とも呼ばれ、グラフィックにおける深さ優先探索のアルゴリズムである.
  • DFSはスタックデータ構造(または再帰関数)を使用し、具体的な操作手順は以下の通りである.
  • ナビゲーション開始ノードをスタックに挿入し、アクセス処理を行う.
  • スタックの最上位ノードにアクセスされていない隣接ノードがある場合、アクセス処理はスタックに格納されます.アクセスされていない隣接ノードがない場合は、スタックから最上位ノードを取り出します.
  • ステップ
  • は、第2のプロセスが実行されなくなるまで繰り返される.
  • def dfs(graph, v, visited) : 
    	# 현재 노드를 방문처리 
    	visited[v] = True 
    	print(v, end='') 
    	# 현재 노드와 연결된 다른 노드를 재귀적으로 방문 
    	for i in graph[v]:
    		if not visited[i]: 
    			dfs(graph, i, visited)
    
    # 각 노드가 연결된 정보를 표현(2차원 리스트) 
    graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5], 
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
    ]
    
    # 각 노드가 방문된 정보를 표현(1차원 리스트) 
    visited = [False] * 9 
    
    #정의된 DFS 함수 호출 
    dfs(graph, 1, visited) 

    BFS(Breadth-First Search)

  • BFSは幅優先探索とも呼ばれ,図形に近いノードから優先探索を開始するアルゴリズムである.
  • BFSはキューデータ構造を採用し、具体的な操作過程は以下の通りである.
  • ナビゲーション開始ノードをキューに挿入し、アクセス処理を行う.
  • キューからノードを取り出し、そのノードのすべての隣接ノードからアクセスされていないノードをキューに挿入してアクセス処理を行う.
  • は、2番目のプロセスが再実行できなくなるまで、
  • を繰り返します.
    →最短距離問題で使える!
    from collections import deque 
    
    #BFS 메서드 정의 
    def bfs(graph, start, visited) : 
    	queue = deque([start]) 
    	# 현재 노드를 방문 처리 
    	visited[start] = True 
    	#큐가 빌 때까지 반복 
    	while queue: 
    		# 큐에서 하나의 원소를 뽑아 출력하기 
    		v = queue.popleft()
    		print(v, end='')
    		# 아직 방문하지 않은 인저한 원소들을 큐에 삽입 
    		for i in graph[v]:
    			if not visited[i]: 
    				queue.append(i) 
    				visited[i] = True 
    
    # 각 노드가 연결된 정보를 표현(2차원 리스트) 
    graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5], 
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
    ]
    
    # 각 노드가 방문된 정보를 표현(1차원 리스트) 
    visited = [False] * 9 
    
    #정의된 DFS 함수 호출 
    bfs(graph, 1, visited) 
    にdevque、heapqの違いと使い方

  • deque

  • 先入先出,BFS
    from collections import deque 
    
    q = deque()
    q.append(1) # 오른쪽에 원소 추가  
    q.popleft() # 왼쪽에 원소 제거 

  • heapq
  • 最小臀部、最大臀部
  • 複数の帯域で、最小値または最大値をすばやく検索する必要がある場合は
  • です.
    import heapq
    heap = []
    heapq.heappush(heap, 1) # 원소 추가 
    heapq.heapop(heap) # 원소 제거 
    
    # 기존 리스트를 heap으로 변환 
    heap2 = [1, 2, 3]
    heapq.heapify(heap2)
    
    # 최대힙 
    a = [1, 2, 5, 3] 
    heap3 = []
    for i in a: 
        heapq.pheapush(heap3, -i)
    for i in range(4):
        print(-heapq.heapop(heap3))