DFS:DFSDepth-First,深度优先搜索
BFS:Breath-First,宽度优先搜索
都是一种搜索,只不过搜索的方法不一样而已。
以二叉树为例:
以文件查找系统为例:
深度优先:
/ -> user -> bin -> lib -> dev -> home -> bit -> etc ...
广度优先:
/ -> user -> dev -> home -> etc -> bin -> bin -> lib ...
Python实现:
import os
import time
def bfs(file_name, paths: list):
dirs = [] # 存放所有目录
result = [] # 存放满足条件的文件路径
for path in paths: # 遍历所有路径
try:
files = os.listdir(path) # 拿到目录下所有的文件名
for file in files:
file_path = os.path.join(path, file) # 补充为绝对路径
if file_name in file: # 符合条件的加入结果
result.append(file_path)
if os.path.isdir(file_path): # 文件夹,可继续深入查找
dirs.append(file_path)
except PermissionError: # 权限不足的文件,跳过
pass
if dirs:
result += bfs(file_name, dirs) # 继续下一层查找
return result
def dfs(file_name, paths: list):
result = [] # 存放满足条件的文件路径
while paths: # 如果有未查找的目录
path = paths[0] # 取出第一个
del paths[0] # 取出后就删除,表示已经被查询过
if file_name in path:
result.append(path) # 符合条件的加入结果
try:
if os.path.isdir(path):
files = os.listdir(path) # 拿到目录下所有的文件名
# 重新排序待查找的目录,并放在最前面
paths = [os.path.join(path, file) for file in files] + paths
except PermissionError:
pass
return result
if __name__ == '__main__':
t = time.time()
a = dfs('测试', ['D:\\'])
print('深度查询耗时:{} 查询结果:'.format(int(time.time() - t)), a)
t = time.time()
b = bfs('测试', ['D:\\'])
print('广度查询耗时:{} 查询结果:'.format(int(time.time() - t)), b)
测试结果:
深度查询耗时:3 查询结果: ['D:\\Project\\test\\测试文件.txt', 'D:\\Project\\venv\\测试文件.txt', 'D:\\rj\\测试文件.txt', 'D:\\安装包\\测试文件.txt']
广度查询耗时:3 查询结果: ['D:\\rj\\测试文件.txt', 'D:\\安装包\\测试文件.txt', 'D:\\Project\\test\\测试文件.txt', 'D:\\Project\\venv\\测试文件.txt']
Process finished with exit code 0