对于TSP,Held-Karp算法如何将Brute-force的O(n!)的时间复杂度降低到O(2 ^ n * n ^ 2)?

时间:2016-11-20 20:18:19

标签: algorithm traveling-salesman

我很难掌握Held-Karp算法的关键思想,它如何减少时间复杂度? 是因为它使用动态编程,以便通过从缓存中获取中间结果来节省时间,还是因为它在计算中先前删除了一些路径?

此外,是否可以使用2维表来显示计算 一个简单的TSP问题(3或4个城市)?

1 个答案:

答案 0 :(得分:1)

Held-Karp算法的动态编程过程利用了TSP问题的以下特性:最小距离路径的每个子路径本身都是最小距离。

基本上,我们不是使用自上而下的蛮力方法(每种可能的排列方式)检查所有解决方案,而是使用"自下而上"解决问题所需的所有中间信息只需一次的方法。最初的步骤是最小的子路径。每次我们向上移动以解决更大的子路径时,我们都能够查找已经计算过的所有较小子路径问题的解决方案。节省时间是因为所有较小的子问题已经得到解决,并且这些节省以指数方式复合(在每个更大的子路径级别)。但是没有"路径被删除"从计算开始 - 在程序结束时,所有子问题都将得到解决。明显的缺点是可能需要非常大的内存大小来存储所有中间结果。

总之,Held-Karp算法节省的时间来自于从不重复解决城市的任何子集(组合)的解决方案。但是暴力方法会多次重新计算任何给定子集组合的解决方案(尽管在给定的整体排列组合中不一定是连续的顺序)。

Wikipedia包含2D距离矩阵示例和伪代码here