我在期中考试时遇到了一个问题。任何人都可以澄清答案吗?
问题A:给定一个完整的加权图G,找到一个权重最小的汉密尔顿游。
问题B:给定一个完整的加权图G和实数R,G是否具有最多R的哈密顿量之旅?
假设有一台机器可以解决B.我们可以多少次呼叫B(每次给出G和实数R),用该机器解决问题A?假设G中边缘的总和达到M.
1)我们不能这样做,因为有无数的状态。
2)O(| E |)次
3)O(lg m)次
4)因为A是NP-Hard,所以不能这样做。
答案 0 :(得分:3)
第一个算法
答案是(3) O(lg m) times
。你只需要在加权图中对最小哈密顿旅行进行二分搜索。请注意,如果图表中存在长度为L
的哈密尔顿之旅,那么检查长度为L'
的哈密尔顿之旅(L' > L
是否存在)是没有意义的,因为您感兴趣在最小重量的哈密尔顿之旅中。因此,在算法的每个步骤中,您可以消除剩余一半可能的游览权重。因此,您必须在计算机B
次调用O(lg m)
,其中m
代表完整图表中所有边的总权重。
修改强>
第二种算法
我稍微修改了上面的算法,该算法使用机器O(|E|)
次,因为有些人说我们不能在不可数的可能值集中应用二进制搜索(并且它们可能是正确的):取来自图的每个可能的边缘子集,并且对于每个子集存储一个值,该值是来自子集的所有边的权重之和。让我们将所有子集的值存储在名为Val
的数组中。此数组的大小为2^|E|
。按递增顺序排序Val
,然后对最小哈密顿路径应用二进制搜索,但这次只使用Val
数组中的值调用解决问题B的机器。由于每个边缘子集都包含在已排序的数组中,因此可以保证找到解决方案。该计算机的总呼叫数为O(lg(2^|E|))
,即O(|E|)
。所以,正确的选择是(2) O(|E|) times
。
注意:
我提出的第一个算法可能不正确,因为有些人注意到你不能在不可数集中应用二进制搜索。由于我们讨论的是实数,因此我们无法在[0-M]
答案 1 :(得分:1)
我认为那个意味着答案的选择是1-你不能那样做。 原因是你只能对可数集进行二进制搜索。
请注意,图形的边缘甚至可能具有负权重,此外,它们可能具有分数或甚至无理的权重。在这种情况下,答案的搜索空间将是小于m的所有实际值的集合。
但是,您可能会在Log(n)时间内任意接近A的答案,但您无法找到确切的答案。 (n是可数空间的大小)。
答案 2 :(得分:1)
假设在图的编码中,权重被编码为表示非负整数的二进制字符串,并且Problem B
实际上可以通过输入实数来解决,并基于此进行计算,事情显然如下。
可以在积分区间{0,...,M}
上进行第一次二分搜索,以获得O(log M)
调用Problem B
算法的哈密顿游的最小权重。随后最佳已知,我们可以消除G
中的单个边缘,并使用结果图作为Problem B
算法的输入来测试最佳变化。此过程使用O(|E|)
对Problem B
算法的调用来识别在最佳哈密顿游览中出现的边。此方法的总运行时间为O( (|E| + log M ) * r(G))
,其中r(G)
表示Problem B
将图G
作为输入的算法的运行时间。我认为r
是一个多项式,尽管问题没有明确说明这一点;总的来说,总运行时间将在输入的编码长度中以多项式为界,因为M
可以在多项式时间内计算(因此在输入G
的编码长度中是伪多项式限制的)
话虽如此,所谓的答案可以评论如下。
Problem A
的 NP - 硬度并不排除多项式时间算法;此外,Problem B
的算法未被声明为多项式,因此如果P=NP
可通过多项式调用次数求解{偶数Problem A
,则 Problem B
的算法(上面概述的算法就是这种情况)。