修改Dijkstra算法以获取从范围


10

假设我有一个有向图,其边权重取自范围[1,,K]其中K为常数。如果我试图使用Dijkstra的算法找到最短路径,如何修改算法/数据结构并将时间复杂度提高到O(|V|+|E|)


您应该更具体一点,您的数据结构是什么?而且您不能获得更少的。复习讲座。O(V+E)
jonaprieto 2012年

仅仅因为不同的边缘权重的可能性很小,并不意味着距离的数量就很小。
2012年

3
蓝色的图形的第一个颜色顶点,那么细分的大小每边牛逼边缘(加入牛逼- 1个无色顶点),然后在这个新图运行BFS,找到从起始节点的最短路径,以蓝色的节点,它的如果您有常数k,则为O | V | + | E |ttt1O(|V|+|E|)k

@SaeedAmiri为什么不写这个作为答案?
2012年

@Joe,因为它没有修改dijkstra(至少直接与dijkstra不相关)。

Answers:


16

如果边的权是整数,你可以实现的Dijkstra在运行Ø ķ | V | + | ë |时,以下@ rrenaud的建议。这是更明确的解释。{0,1,,K}O(K|V|+|E|)

任何时候,优先级队列中的(有限)键都在,其中D是从优先级队列中删除的最后一个键的值。(每个键至少为d,因为键的通过Dijkstra算法去除的序列是非递减,并且每一个键为至多d + ķ,因为每个键具有值d [ ù ] + 瓦特Û 瓦特为某个边缘u {D,D+1,,D+K}DDD+Kd[u]+wt(u,w)其中 d [ ù ]是从源到一些顶点的距离 ü已经被删除,所以 d [ ù ] d。)(u,w)d[u]ud[ü]d

因此,您可以使用大小为K + 1的圆形数组来实现优先级队列,每个单元格都包含一个存储桶。存储与密钥每个顶点ķ在细胞铲斗[ ħ ķ ]其中ħ ķ = ķ MOD ķ + 1 。跟踪的d。进行如下操作:一个[0 ..ķ]ķ+1个ķ一个[H(k)]h(k)=kmod(K+1)D

  • 删除最小:当是空的,增量d。然后删除并从A [ h D ]返回一个顶点。A[h(D)]DA[h(D)]

  • 用键插入:将顶点添加到A [ h k ]的桶中。kA[h(k)]

  • 减小键 k ':将顶点从A [ h k ]移到A [ h k ']kkA[h(k)]A[h(k)]

插入键和减小键是固定时间的操作,因此在这些操作中花费的总时间为。在删除最小花费的总时间将是ø | V |加上的最终值d ,因为每个路径具有至多| V |O(|V|+|E|)O(|V|)D。的最终值是从源到任何顶点的最大(有限的)距离(因为删除分钟即需要迭代iterations增加ð通过)。最大距离最大为K | V |1DiDiK(|V|1)边缘。因此,该算法花费的总时间为 O K | V | + | E ||V|1O(K|V|+|E|)


我喜欢循环队列,这比我基本上拥有一个K * v大小的数组的想法要好得多,该数组在任何给定时间仅使用av大小的切片。
rrenaud

我使用双链表实现了它,这是否仍然意味着查找最小键为O(1)?
user1675999

@ user1675999,我不确定。如果您的列表是按键排序的,那么如何有效地插入和减少键?如果您的列表不是按键排序的,那么如何有效地删除分钟?
Neal Young

5

我在这里假设是整数,边缘权重是整数。否则,它实际上并不会给您带来任何好处,您始终可以重新调整权重,以使最小边的成本为1,最大边的成本为K,因此该问题与标准的最短路径问题相同。K1K

算法/证明草图:以这种疯狂的方式将优先级队列实现为的数组。V | 列出以成本为关键字的清单,否则使用标准的Dijkstra算法。保持一个计数器,该计数器跟踪堆中最小项目的成本。通过线性扫描删除项目后,解决出队调用。是的,这种声音听起来很疯狂,但常数KK×|V|K让我们欺骗和欺骗您的线性直觉算法直觉。您只需要从最后一个min标记开始扫描,因为Disjkstra的算法非常适合您的队列实现。在请求出队时,插入队列的项目始终大于或等于先前的最小值。最长的最短路径的长度为因此,您的摊销扫描成本为K × | V | 如果K为常数,则= O | V |K×|V|K×|V|=O(|V|)


-2

您可以使用拓扑排序找到解决方案,然后让源的度数为0,从源的每个边开始移动,如果另一个顶点的度数为0,则将其放入队列并继续进行操作。在这种情况下(在图形内部没有循环),它可以实现V + E,因为它将遍历每个顶点和边缘一次且仅一次。


似乎与问题无关?问题不是假设图形是非循环的,并且您的解决方案没有利用权重是从恒定范围得出的事实。
xskxzr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.