当前位置: 首页 > 面试题库 >

Python Dijkstra算法

鲁向明
2023-03-14
问题内容

我正在尝试编写Dijkstra的算法,但是我在努力如何在代码中“说”某些事情而苦苦挣扎。为了可视化,这是我要使用数组表示的列:

   max_nodes  
   A  B  C         Length       Predecessor       Visited/Unvisited
A 0  1   2             -1                                              U
B 1  0   1             -1                                              U
C 2  1   0             -1                                              U

因此,将有几个数组,如下面的代码所示:

def dijkstra (graph, start, end)

network[max_nodes][max_nodes]
state  [max_nodes][length]
state2 [max_nodes][predecessor]
state3 [max_nodes][visited]
initialNode = 0

    for nodes in graph:
      D[max_nodes][length] = -1
      P[max_nodes][predecessor] = ""
      V[max_nodes][visited] = false

      for l in graph:

       length = lengthFromSource[node] + graph[node][l]
          if length < lengthFromSourceNode[w]:
             state[l][length] = x
             state2[l][predecessor] 
             state3[l][visited] = true
          x +=1

粗体部分是我要坚持的地方-我正在尝试实现算法的这一部分:

3.对于当前节点,请考虑其所有未访问的邻居并计算其暂定距离。
例如,如果当前节点(A)的距离为6,并且将其与另一个节点(B)相连的边为2,则通过A到B的距离将为6 + 2 =
8。如果此距离小于以前记录的距离,则覆盖距离
4。完成考虑当前节点的所有邻居后,将其标记为已访问。访问过的节点将不再被检查;现在记录的距离是最终的和最小的

我认为我走在正确的轨道上,我只是停留在怎么说:“从节点开始,获取从源到节点的长度,如果长度较小,则覆盖先前的值,然后移至下一个节点


问题答案:

首先,我认为这是一个作业问题,因为最好的建议是不要自己去写,而是在网络上找到现有的实现。
例如,这看起来不错。

假设您 确实 需要重新设计轮子,那么那里引用的代码将使用字典来存储节点数据。因此,您可以输入以下内容:

{ 
  's': {'u' : 10, 'x' : 5}, 
  'u': {'v' : 1, 'x' : 2}, 
  'v': {'y' : 4}, 
  'x': {'u' : 3, 'v' : 9, 'y' : 2}, 
  'y': {'s' : 7, 'v' : 6}
}

这似乎是呈现图形信息的更直观的方法。访问的节点和距离也可以保存在字典中。



 类似资料:
  • 数学模型 1. 近似 2. 增长数量级 3. 内循环 4. 成本模型 注意事项 1. 大常数 2. 缓存 3. 对最坏情况下的性能的保证 4. 随机化算法 5. 均摊分析 ThreeSum 1. ThreeSumSlow 2. ThreeSumBinarySearch 3. ThreeSumTwoPointer 倍率实验 数学模型 1. 近似 N3/6-N2/2+N/3 ~ N3/6。使用 ~f(

  • 我正在使用ModBus RTU,并试图找出如何计算CRC16。我不需要代码示例。我只是对机制很好奇。我已经了解到,基本的CRC是数据字的多项式除法,根据多项式的长度,用零填充。下面的测试示例应该检查我的基本理解是否正确: 数据字:01001011 多项式:1001(x3+1) 由于最高指数x3而被填充3位 计算:0100 1011 000/1001->余数:011 计算。 null 第二次尝试:由

  • 本文向大家介绍Java算法之递归算法计算阶乘,包括了Java算法之递归算法计算阶乘的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下 代码如下: 运行结果:

  • 第一部分:Top K 算法详解 问题描述 百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。 必备知识 什么是哈

  • 算法 我注意到从第一章开始,容器就占据了STL喝彩声中最大的一份。在某种意义上,这是可以理解的。容器有着非凡的造诣,它们使大批C++程序员每天的基本生活变得简单。尽管如此,STL算法的权利也很重要,一样有能力减轻程序员的负担。事实上,有超过100个算法,很容易证明比起容器,它们提供给程序员更精巧的工具集(起码一样强)。也许它们的数量是一部分问题。搞清八种截然不同的容器类型明显比记住70个算法的名字

  • 排序 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象稳定性 冒泡排序 O(n2) O(n2) O(1) 稳定 选择排序 O(n2) O(n2) O(1) 数组不稳定、链表稳定 插入排序 O(n2) O(n2) O(1) 稳定 快速排序 O(n*log2n) O(n2) O(log2n) 不稳定 堆排序 O(n*log2n) O(n*log2n) O(1) 不稳定 归并排序 O(n*

  • 算法

  • 目录 ​排序算法​ ​检索算法​