1.はじめに
深さ優先探索(DFS)と幅優先探索(幅優先探索)は、グラフ理論において非常に重要な2つのアルゴリズムであり、トポロジカルソート、パス検索(迷路)、検索エンジン、クローラーなどの生産で広く使用されています。また、リートコード、高頻度のインタビューの質問にも頻繁に表示されます。
第二に、深さ優先探索
主なアイデアは、グラフ内の未訪問の頂点Vから開始し、1つの道路に沿って最後に移動し、この道路の端から前のノードに戻ってから、別の道路から最後に移動することです...再帰的に繰り返しますこのプロセスは、すべての頂点が横断されるまで、南の壁にぶつからず、後戻りせず、最初に1つのパスを終了し、次に別のパスを変更して歩行を続行することを特徴としています。
ツリーはグラフの特殊なケースです(接続された非巡回グラフはツリーです)。次に、深さ優先走査を使用してツリーを走査する方法を見てみましょう。
- ルートノード1からトラバースを開始し、その隣接ノードは2、3、4です。最初にノード2をトラバースし、次に2の子ノード5をトラバースし、次に5の子ノード9をトラバースします。
- 上の図では、道路が最後まで到達しています(9はリーフノードであり、トラバース可能なノードはもうありません)。このとき、9から前のノード5に戻って、他のノードがあるかどうかを確認します。ノード5の9よりも、2にフォールバックする続行はなく、2には5以外のノードがなく、1にフォールバックし、1には2以外のノード3があるため、深さ優先走査はノード3から始まります。 、 次のように:
- 同様に、10から6に戻ると、6には10以外の子ノードがなく、次に戻ると、3には6以外の子7があることがわかります。したがって、この時点で7をトラバースします。 。
- 7から3と1に戻り、1とノード4がトラバースされていないことを確認します。この時点で、4と8に沿ってトラバースし、トラバースが完了します。
完全なノードのトラバーサルシーケンスは次のとおりです(ノードの青い数字はを表します)。
# 深度遍历目录
import os,collections
path = r'D:\test\work_file\meishi'
def GetAllDirDeep(path):
stack = []
stack.append(path)
# 处理栈,当栈为空时结束循环
while len(stack) != 0:
# 从栈里取出数据
DirPath = stack.pop()
#print("DirPath =",DirPath)
# 目录下所有文件
FileList = os.listdir(DirPath)
#print("FileList =",FileList)
# 循环处理每个文件
for FileName in FileList:
FileAbsPath = os.path.join(DirPath,FileName)
#print("FileName ",FileName)
if os.path.isfile(FileAbsPath) == True:
print("是文件",FileAbsPath)
else:
print("是目录",FileAbsPath)
stack.append(FileAbsPath)
GetAllDirDeep(path)
第三に、幅優先探索
幅優先トラバーサルとは、グラフ内のトラバースされていないノードから開始し、最初にこのノードの隣接ノードをトラバースし、次に各隣接ノードの隣接ノードを順番にトラバースすることを指します。
上記のツリーの幅優先走査グラフは次のとおりです。各ノードの値は、それらの走査順序です。したがって、幅優先トラバーサルはレイヤーシーケンストラバーサルとも呼ばれ、最初に最初のレイヤー(ノード1)をトラバースし、次に2番目のレイヤー(ノード2、3、4)、3番目のレイヤー(5、6、7、8)をトラバースします、第4層(9、10)。
深さ優先トラバーサルはスタックを使用し、幅優先トラバーサルはキューを使用して実装されます。例としてバイナリツリーを使用して、キューを使用して幅優先トラバーサルを実装する方法を見てみましょう。
import os,collections
path = r'D:\test\work_file\meishi'
# 广度遍历目录
def GetAllDirScope(path):
queue = collections.deque()
# 进队
queue.append(path)
print("queue =",queue)
while len(queue) != 0:
# 出队数据
FilePath = queue.popleft()
#print(FilePath)
# 找出所有的文件
FileNameList = os.listdir(FilePath)
for FileName in FileNameList:
#print(FileName)
FileAbsPath = os.path.join(FilePath,FileName)
if os.path.isfile(FileAbsPath) == True:
print("是文件",FileAbsPath)
else:
print("是目录",FileAbsPath)
queue.append(FileAbsPath)
GetAllDirScope(path)
4、再帰を使用してトラバースします
import os,collections
path = r'D:\test\work_file\meishi'
def GetAllDir(path):
FileList = os.listdir(path)
for FileName in FileList:
NewFileName = path + "\\" + FileName
print("NewFileName =",NewFileName)
if os.path.isdir(NewFileName):
print("是目录")
GetAllDir(NewFileName)
else:
print("是文件")
GetAllDir(path)