首页 经验

先说了一下dfs递归实现, 用迪杰斯特拉的思路

时间: 2024-10-21 09:38:58

(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)

深度优先搜索(DFS)和迪杰斯特拉(Dijkstra)算法是两种不同的图算法,通常用于解决不同类型的问题。不过,我们可以讨论如何使用 DFS进行某种形式的遍历,同时触发与 Dijkstra 算法相关的逻辑,例如找到图中最短路径的问题。


DFS递归实现

深度优先搜索(Depth First Search,DFS)是一种图遍历算法,使用递归或栈来进行遍历。其基本思路是尽可能深的搜索树的分支,直到无法继续为止,然后回溯到上一个节点,尝试其他分支。


DFS递归实现示例

以下是一个简单的 DFS递归实现,假设我们有一个无向图表示为邻接表:


python

def dfs(graph, node, visited):

 if node not in visited:

 print(node) #访问当前节点 visited.add(node)

 for neighbor in graph[node]:

    # 遍历所有相邻节点

    dfs(graph, neighbor, visited)


# 示例图的邻接表表示

graph = {

 'A': ['B', 'C'],

 'B': ['A', 'D', 'E'],

 'C': ['A', 'F'],

 'D': ['B'],

 'E': ['B', 'F'],

 'F': ['C', 'E']

}


visited = set()

dfs(graph, 'A', visited)


Dijkstra 算法的思路

Dijkstra 算法用于找到图中某个节点到其他所有节点的最短路径。它维护一个最小优先队列(通常使用堆)以选择当前已知的最短路径的节点进行扩展。


Dijkstra 算法的基本步骤

1. 初始化

 - 设置起点到自身的距离为0,其他节点的距离为无穷大。

 - 将未访问节点的集合加入优先队列。


2. 访问节点

 - 从优先队列中取出距离最小的节点,标记为已访问。

 - 更新这个节点的所有邻居的距离:如果通过当前节点到达邻居的距离小于已知的距离,则更新。


3. 重复

 -继续访问未访问的节点,直到所有节点都被访问或优先队列为空。


Dijkstra 算法示例(非递归实现)


python

import heapqdef dijkstra(graph, start):

 # 初始化距离和优先队列

 distances = {node: float('infinity') for node in graph}

 distances[start] =0

 priority_queue = [(0, start)] # (距离, 节点)

 while priority_queue:

 current_distance, current_node = heapq.heappop(priority_queue)


 # 节点已被访问,跳过

 if current_distance > distances[current_node]:

     continue for neighbor, weight in graph[current_node].items():

     distance = current_distance + weight

     #只考虑更短的路径

     if distance < distances[neighbor]:

      distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor))


 return distances

# 示例图的邻接表表示(权重)

graph = {

 'A': {'B':1, 'C':4},

 'B': {'A':1, 'D':2, 'E':5},

 'C': {'A':4, 'F':1},

 'D': {'B':2},

 'E': {'B':5, 'F':3},

 'F': {'C':1, 'E':3}

}


start_node = 'A'

print(dijkstra(graph, start_node))


总结

1. DFS:深度优先搜索通过递归逐层深入探寻,适合寻找路径、遍历或搜索图的结构。

2. Dijkstra:用于找到从某个起点到所有其他节点的最短路径,利用优先队列(堆)进行效率优化,依赖于边的权重。


虽然 DFS 和 Dijkstra 有不同的应用场景,但在某些情况下(例如图的遍历),可以在 DFS 中结合使用权重或状态来进行更复杂的路径搜索。


上一个 100w个数,怎么找到前1000个最大的,堆排序,怎么构造,怎么调整,时间复杂度。 文章列表 下一个 四辆小车,每辆车加满油可以走一公里,问怎么能让一辆小车走最远。

最新

工具

© 2019-至今 适观科技

沪ICP备17002269号