必要な資料構造の基礎
20512 ワード
ナビゲーションとは
これは、大量のデータから必要なデータを検索するプロセスを意味します.
プログラミングにおけるグラフィック,ツリーなどの資料構造における探索に関する問題
代表的なナビゲーションアルゴリズムを使用してDFS/BFSを正しく理解するには、まず基本データ構造スタックとキューを理解する必要があります.
スタックとキューを使用する場合は、挿入と削除に加えて、オーバーフローとバックフローも考慮されます.
オーバーフローは、あるデータ構造が格納できるデータのサイズが満たされている場合に発生します.逆に,資料構造なしで削除しようとすると,バックフローが発生する.
スタック
スタックはFILOまたはLIFO、すなわち先入後出、後入先出構造である.
stack.append() stack.pop()などの方法を実現できる.
キュー
Qは先入先出のFIFO構造である.
collections import deque#collectionsモジュールからdequeデータ構造を使用する
queue = deque()
queue.append()#の末尾に返済を挿入
queue.Popleft()#削除して一番前の返済に戻る
queue.逆順()#
dequeueはスタックとキューの利点を採用し、データの挿入と削除速度はリストデータ型よりも効率的で簡単である.
ほとんどの符号化テストでは、collectionsモジュールなどの基本ライブラリを使用できます.
Dequeueオブジェクトをリストデータ型に変更する場合はlistメソッドを使用します.list(dequeue)
さいきかんすう
DFSとBFSを実現するには,その貴重さも理解しなければならない.
def recursive_function:
print('재귀함수를 호출합니다.')
recursive_function()
recursive_function()
このコードを実行すると、文字列「再帰関数の呼び出し」が無限に出力されます.もちろん、Python Interferにはコール回数制限がありますが、この制限を超えると、
再帰誤差が発生する.
再帰関数は数学の授業で述べたフラクタル構造に似ている.
再帰関数の終了条件
def recursive_function(i):
if i == 100:
return
print(i,'번째 재귀 함수에서',i+1,'번째 재귀함수를 호출합니다.')
recursive_function(i+1)
print(i,'번째 재귀 함수를 종료합니다.')
recursive_function(1)
再帰関数の実行にはスタックデータ構造が使用されます.従って、スタックデータ構造を使用する必要がある多くのアルゴリズムは、再帰関数を用いて容易に実現することができる.DFSは典型的な例である.
再帰関数を用いた代表的な例には工場問題がある.
数学では0!第1課利用した値が1に等しい性質は,工場関数がnが1未満のときに関数を終了する再帰関数の形で実現できる.
#반복적으로 구현한 n!
def factorial_iterative(n):
result = 1
for i in range(1,n+1):
result *= i
return result
#재귀적으로 구현한 n!
def factorial_recursive(n):
if n <= 1:
return 1
return n * factorial_recursive(n-1)
実行結果は同じであるが,再帰関数は再帰(点式)をソースコードに直接移行するため簡潔である.ナビゲーションアルゴリズムDFS/BFS
DFS
DFSは深さ優先探索とも呼ばれ,グラフィックにおける深さ優先探索のアルゴリズムである.
グラフィックはノードと幹線を表し、ノードは頂点とも呼ばれます.
グラフィックブラウズとは、1つのノードから複数のノードにアクセスすることです.
プログラミングでは、グラフィックは2つの方法で表現することができ、符号化テストでは、この2つの方法が必要です.
隣接マトリクス:グラフィックの接続関係を2 D配列で表す
隣接リスト:グラフの接続関係をリストで表す方法
0120075170無限25無限0
隣接マトリクス方式:
これは,2次元配列における各ノードの接続の形態を記録する方式である.
上記の図形を隣接行列として表す場合、Pythonは2次元リストとして表すことができる.
接続されていないノード間の料金は無限です.
実際のコードでは,論理的に正しく答えられない大きな値のうち,9999999999,987654321等に初期化されることが多い.
このように隣接行列で図形を処理する場合、データの初期化は以下のようになる.
INF = 999999999 #무한의 비용 선언
#2차원 리스트를 이용해 인접행렬 표현
graph= [
[0,7,5],
[7,0,INF],
[5,INF,0],
]
print(graph)
[[0,7,5],[7,0,999999999],[5,999999999,0]]隣接リストでは、
「接続リスト」という名前の資料構造を使用して実現します.
#행(Row)이 3개인 2차원 리스트로 인접 리스트 표현
graph = [[] for _ in range(3)]
#노드 0에 연결된 노드정보 저장(노드,거리)
graph[0].append((1,7))
graph[0].append((2,5))
#노드 1에 연결된 노드정보저장(노드,거리)
graph[1].append((0,7))
graph[2].append((0,5))
print(graph)
[[(1,7),(2,5)],[(0,7)],[(0,5)]]この2つの方法にはどんな違いがありますか?
メモリの観点から,隣接マトリクスはすべての関係を格納し,ノードが多ければ多いほどメモリが浪費される.
逆に,隣接リスト方式は接続された情報のみを格納するため,メモリを効率的に使用できる.
しかし,これらの属性のため,隣接リスト方式は隣接マトリクス方式に比べて,特定の2つのノードが接続されているか否かの情報を取得する速度が遅い.
隣接リスト方式では,接続されたデータを逐一確認するためである.
したがって、あるノードに関連付けられたすべての隣接ノードを巡回する必要がある場合、隣接リスト方式は隣接マトリクス方式に比べてメモリ空間の浪費が小さくなる.
DFS & BFS
DFSはスタック構造を採用し、具体的な操作過程は以下の通りである.
1.ナビゲーション開始ノードをスタックに挿入し、アクセス処理を行います.
2.スタックの最上位ノードに未アクセスの隣接ノードがある場合は、スタックに入れてアクセス処理を行います.アクセスされていない隣接ノードがない場合は、スタックから最上位ノードを取り出します.
3.再実行できなくなるまで2回目の手順を繰り返します.
ノード1を起動ノードに設定し、DFSを使用してナビゲートした場合、どうなりますか?
通常、ノードにアクセスされていないノードが複数ある場合は、番号の低い順序から処理を開始します.
DFSの機能を考慮すると、順序で処理することができるが、符号化テストは、番号の低い順序から処理を開始することを示すことが多い.
そこで、慣例に従って、番号の低い順から処理を開始する.
1.DFS
2.BFS
3.比較
DFSの例
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
BFSアルゴリズムは「幅優先探索」の意味を持つ.近接ノードから探索を開始するアルゴリズムである.DFSはできるだけ遠くのノードを優先的に閲覧するように動作するが,BFSは逆であるという.
BFSを実施する際には,先入先出のキュー資料構造を採用することが慣例である.
アルゴリズムを記述して、隣接ノードをキューに繰り返し入れます.
さぎょうモード
from collections import deque
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
#정의된 BFS 함수 호출
bfs(graph, 1, visited)
1 2 3 8 7 4 5 6DFS BFSの実施をまとめる
DFSSBFS動作原理スタックキューの実装方法再利用可能なキューリソース構造を使用する
Reference
この問題について(必要な資料構造の基礎), 我々は、より多くの情報をここで見つけました https://velog.io/@grapefruitgreen/꼭-필요한-자료구조-기초テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol