python 图 深度广度优先

# coding=utf8
from collections import deque


# 深度优先遍历
G = [
    {1, 2, 3},     # 0
    {0, 4, 6},     # 1
    {0, 3},        # 2
    {0, 2, 4},     # 3
    {1, 3, 5, 6},  # 4
    {4, 7},        # 5
    {1, 4},        # 6
    {5, }
]

print G

# 递归深度优先
# 深度优先是一次访问到底,知道没有连接的顶点,再逐级返回,再逐级访问
def dfs(G, v, visited=set()):
    print v
    visited.add(v)  # 用来存放已经访问过的顶点
    # G[v] 是这个顶点的相邻的顶点
    for u in G[v]:
        # 这一步很重要,否则就进入了无限循环,只有这个顶点没有出现在这个集合中才会访问
        if u not in visited:
            dfs(G, u, visited)

# 迭代深度优先
def dfs_iter(G, v):
    visited = set()
    s = [v]
    while s:
        u = s.pop()
        if u not in visited:
            print u
            visited.add(u)
            s.extend(G[u])

dfs_iter(G, 0)



# 广度优先遍历
# 广度优先是,从某一个顶点出发,先访问一步能够到达的顶点,再访问两步能够达到的顶点,以此类推
def bfs(G, v):
    q = deque([v])
    # 同样需要申明一个集合来存放已经访问过的顶点,也可以用列表
    visited = {v}
    while q:
        u = q.popleft()
        print u
        for w in G[u]:
            if w not in visited:
                q.append(w)
                visited.add(w)

print "BFS"
bfs(G, 0)




# dfs(G, 0)

 

### Python深度优先搜索 (DFS) 和广度优先搜索 (BFS) 的实现 #### 深度优先搜索 (DFS) 深度优先搜索是一种遍历或搜索树或的算法。该算法沿着树的分支尽可能深地探索,直到达到叶子节点或者满足某些条件为止。以下是基于递归和栈两种方式实现的 DFS: ##### 基于递归的 DFS 实现 ```python def dfs_recursive(graph, node, visited=None): if visited is None: visited = set() visited.add(node) print(node, end=" ") # 访问当前节点 for neighbor in graph[node]: if neighbor not in visited: dfs_recursive(graph, neighbor, visited) ``` 上述代码通过递归访问每个节点的所有邻居来完成搜索过程[^1]。 ##### 基于显式栈的 DFS 实现 ```python def dfs_iterative(graph, start_node): stack, visited = [start_node], {start_node} while stack: current_node = stack.pop() print(current_node, end=" ") for neighbor in reversed(graph[current_node]): if neighbor not in visited: stack.append(neighbor) visited.add(neighbor) ``` 此版本利用显式的栈结构替代函数调用堆栈,适合处理较大的数据集以避免递归过深引发错误。 --- #### 广度优先搜索 (BFS) 广度优先搜索按照层次顺序依次访问所有节点,通常借助队列实现。下面展示了一个 BFS 的标准实现: ##### 使用队列的 BFS 实现 ```python from collections import deque def bfs(graph, start_node): queue = deque([start_node]) visited = {start_node} while queue: current_node = queue.popleft() print(current_node, end=" ") for neighbor in graph[current_node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) ``` 这段代码展示了如何使用 `deque` 来管理待访问节点列表,并按层序逐一扩展节点[^2]。 --- ### 算法的选择依据 在实际应用中,选择 DFS 或 BFS 取决于问题的具体需求以及性能考量。例如,在寻找最短路径时,BFS 更加合适;而在检测连通分量或其他场景下可能更倾向于采用 DFS。此外,当面对大规模状态空间时,可以考虑结合两者优势的方法,如迭代加深深度优先搜索(IDS)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值