假设我有一个有向图,其边权重取自范围,其中为常数。如果我试图使用Dijkstra的算法找到最短路径,如何修改算法/数据结构并将时间复杂度提高到?
假设我有一个有向图,其边权重取自范围,其中为常数。如果我试图使用Dijkstra的算法找到最短路径,如何修改算法/数据结构并将时间复杂度提高到?
Answers:
如果边的权是整数,你可以实现的Dijkstra在运行Ø (ķ | V | + | ë |)时,以下@ rrenaud的建议。这是更明确的解释。
任何时候,优先级队列中的(有限)键都在,其中D是从优先级队列中删除的最后一个键的值。(每个键至少为d,因为键的通过Dijkstra算法去除的序列是非递减,并且每一个键为至多d + ķ,因为每个键具有值d [ ù ] + 瓦特吨(Û ,瓦特)为某个边缘(u ,其中 d [ ù ]是从源到一些顶点的距离 ü已经被删除,所以 d [ ù ] ≤ d。)
因此,您可以使用大小为K + 1的圆形数组来实现优先级队列,每个单元格都包含一个存储桶。存储与密钥每个顶点ķ在细胞铲斗甲[ ħ (ķ )]其中ħ (ķ )= ķ MOD (ķ + 1 )。跟踪的d。进行如下操作:
删除最小:当是空的,增量d。然后删除并从A [ h (D )]返回一个顶点。
用键插入:将顶点添加到A [ h (k )]的桶中。
减小键 到k ':将顶点从A [ h (k )]移到A [ h (k ')]。
插入键和减小键是固定时间的操作,因此在这些操作中花费的总时间为。在删除最小花费的总时间将是ø (| V |)加上的最终值d ),因为每个路径具有至多| V |。的最终值是从源到任何顶点的最大(有限的)距离(因为删除分钟即需要我迭代iterations增加ð通过我)。最大距离最大为K (| V | − 1边缘。因此,该算法花费的总时间为 O (K | V | + | E |)。
我在这里假设是整数,边缘权重是整数。否则,它实际上并不会给您带来任何好处,您始终可以重新调整权重,以使最小边的成本为1,最大边的成本为K,因此该问题与标准的最短路径问题相同。
算法/证明草图:以这种疯狂的方式将优先级队列实现为的数组。V | 列出以成本为关键字的清单,否则使用标准的Dijkstra算法。保持一个计数器,该计数器跟踪堆中最小项目的成本。通过线性扫描删除项目后,解决出队调用。是的,这种声音听起来很疯狂,但常数K让我们欺骗和欺骗您的线性直觉算法直觉。您只需要从最后一个min标记开始扫描,因为Disjkstra的算法非常适合您的队列实现。在请求出队时,插入队列的项目始终大于或等于先前的最小值。最长的最短路径的长度为因此,您的摊销扫描成本为K × | V | 如果K为常数,则= O (| V |)。