用于TSP的Bellman-Held-Karp算法的时间复杂度,取2


16

一个独立于BellmanHeld-Karp的问题最近讨论了TSP的当前经典动态编程算法。据普遍报道,该算法在时间内运行。但是,正如我的一名学生最近指出的那样,这种运行时间可能需要一个不合理的强大计算模型。O(2nn2)

这是该算法的简要说明。输入由具有个顶点的有向图和非负长度函数。对于任何顶点和,以及任何不包含和的顶点子集,令表示诱导子图从到的最短哈密顿路径的长度。。Bellman-Held-Karp算法基于以下递归(或经济学家和控制理论家喜欢称其为“ Bellman方程”):Ñ È [R +小号X 小号大号小号X 小号ģ [ X { 小号} ]G=(V,E)n:ER+stXstL(s,X,t)stG[X{s,t}]

L(s,X,t)={(s,t)if X=minvX (L(s,X{v},v)+(v,t))otherwise

对于任何顶点s,最优旅行推销员巡视的长度为L(s,V{s},s)。因为第一个参数s在所有递归调用中都是常数,所以存在Θ(2nn)不同的子问题,并且每个子问题最多依赖于其他n个子问题n。因此,动态编程算法以O(2nn2)时间运行。

还是呢?

标准整数RAM模型允许对具有O(logn)位的整数进行恒定时间操作,但是至少对于算术逻辑运算,必须将较大的整数分解为字大小的块。(否则,可能会发生奇怪的事情。)访问更长的内存地址是否还不正确? 如果算法使用超多项式空间,是否合理地假设内存访问仅需要恒定的时间?

特别是对于Bellman-Held-Karp算法,该算法必须针对每个v将子集X的描述转换为子集X{v},以便访问备忘录表。如果子集用整数表示,则这些整数需要n位,因此不能在恒定时间内进行操作;如果它们不是用整数表示,则它们的表示不能直接用作备忘录表的索引。vn

那么:Bellman-Held-Karp算法的实际渐近运行时间是多少?


您的“奇怪的事物”链接已损坏。
泰森·威廉姆斯

我修复了链接。
Jeffε

Answers:


12

这是一个数学答案不是一个哲学一少,但我更愿意认为一个内存模式,让有位的某一号B整型常量时间操作的是未知的,但至少一样大,其中S是算法所需的空间量。因为,如果整数不是那么大,那么您怎么能解决内存问题呢?对于多项式时间和空间算法,它与O(log n)位相同,但是对于指数空间算法,它避免了该问题。log2S

当然,如果S超出了您实际拥有的内存量,则算法将根本无法运行。或者,它将通过将信息分页到内存中和从内存中分页运行,您应该使用内存层次模型而不是RAM模型。


我已经习惯了机器模型应该取决于输入大小的想法,但是让机器模型依赖于算法有些奇怪。只要您已经在使用指数空间,您是否真的要让您的机器在固定时间内解决PSPACE中的任何问题?n
杰夫斯

3
对我来说,这不是一个使模型随算法而变化的问题,而更多的是拥有一个固定但不能运行所有算法的模型(因为空间不足)。对我来说,这听起来与真正的计算机没什么不同。
David Eppstein 2010年

1
大卫的回答使我不相信。这里有两个问题。一种是理论的,另一种是实用的。在理论上,更自然的是对模型进行精确的分析并适当地分析运行时间。在实际设置中,由于某个人可以进行的各种优化(以及进行部分记忆等),要知道某个特定实例是否会真正用完内存并不容易,但是,在实现该算法时,我们将不得不处理我们如何存储集合并对其进行索引。上面的模型在这方面没有帮助。
Chandra Chekuri 2011年

8

Fedor V. Fomin和Dieter Kratsch的最新著作“ Exact Exponential Algorithms ”中对此问题进行了讨论,他们在单位成本RAM模型和对数成本RAM模型中指定运行时间(最大距离城市和之间˚F ñ = Ô *ñ 如果˚F ñ = öñ p Ô ý ñ ):Wf(n)=O(g(n))f(n)=O(g(n)poly(n))

2 Ñ登录W¯¯ Ñ Ô1 (注意, 2 Ñ登录W¯¯ Ñ Ô1 Ô * 2 Ñ)分别。O(2n)2nlogWnO(1)2nlogWnO(1)O(2n)


1
因此他们通过隐藏多项式因子来躲避问题。我想知道什么是多项式因子!
杰夫斯(Jeffε)2010年

3
他们假设多项式因子为(请参阅我的评论中的链接)。n2
Oleksandr Bondarenko 2010年
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.