Pythonは、深さ優先トラバーサル(DFS)と幅優先トラバーサル(BFS)を実装します

1.はじめに

深さ優先探索(DFS)と幅優先探索(幅優先探索)は、グラフ理論において非常に重要な2つのアルゴリズムであり、トポロジカルソート、パス検索(迷路)、検索エンジン、クローラーなどの生産で広く使用されています。また、リートコード、高頻度のインタビューの質問にも頻繁に表示されます。

第二に、深さ優先探索

主なアイデアは、グラフ内の未訪問の頂点Vから開始し、1つの道路に沿って最後に移動し、この道路の端から前のノードに戻ってから、別の道路から最後に移動することです...再帰的に繰り返しますこのプロセスは、すべての頂点が横断されるまで、南の壁にぶつからず、後戻りせず、最初に1つのパスを終了し、次に別のパスを変更して歩行を続行することを特徴としています。

ツリーはグラフの特殊なケースです(接続された非巡回グラフはツリーです)。次に、深さ優先走査を使用してツリーを走査する方法を見てみましょう。

ここに画像の説明を挿入

  1. ルートノード1からトラバースを開始し、その隣接ノードは2、3、4です。最初にノード2をトラバースし、次に2の子ノード5をトラバースし、次に5の子ノード9をトラバースします。
    ここに画像の説明を挿入
  2. 上の図では、道路が最後まで到達しています(9はリーフノードであり、トラバース可能なノードはもうありません)。このとき、9から前のノード5に戻って、他のノードがあるかどうかを確認します。ノード5の9よりも、2にフォールバックする続行はなく、2には5以外のノードがなく、1にフォールバックし、1には2以外のノード3があるため、深さ優先走査はノード3から始まります。 、 次のように:ここに画像の説明を挿入
  3. 同様に、10から6に戻ると、6には10以外の子ノードがなく、次に戻ると、3には6以外の子7があることがわかります。したがって、この時点で7をトラバースします。 。
    ここに画像の説明を挿入
  4. 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)

おすすめ

転載: blog.csdn.net/zhuan_long/article/details/109999242