修改Dijkstra算法以获取从范围


10

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


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

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

3
蓝色的图形的第一个颜色顶点,那么细分的大小每边到牛逼边缘(加入牛逼- 1个无色顶点),然后在这个新图运行BFS,找到从起始节点的最短路径,以蓝色的节点,它的如果您有常数k,则为O (| V | + | E |)。ttt−1O(|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 ')]。kk′A[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.