【发布时间】:2013-12-12 17:50:56
【问题描述】:
据我了解,有两个步骤可以证明问题是 NP 完全的:
给出一个算法,可以在多项式时间内验证问题的解决方案。也就是说,一种算法,其输入是对问题提出的解决方案,其输出是“是”或“否”,这取决于输入是否是问题的有效解决方案。
证明问题是 NP 难题 - 例如,假设您有一个预言机,可以一步计算另一个已知的 NP 完全问题。使用它,编写一个在多项式时间内解决此问题的算法。
例如,假设我们要证明以下问题是NP完全的:
给定一组整数S,是否有可能隔离元素子集S',使得S' 中的元素之和正好等于@ 中剩余元素之和987654324@ 不包含在S' 中?
第一步:验证算法
Verify_HalfSubset(Set S, Solution sol):
accum = 0
for each element i in sol:
accum+=i
linear search for an element with the same value as i in S.
if found, delete it from s, if not found, return false
end for
accum2 = 0
for each element i in S:
accum2+=i
end for
if accum==accum2 return true, else return false
显然这在多项式时间内运行:第一个 for 循环在 O(nm) 中运行,第二个在 O(n) 中运行。
第 2 步:减少
假设我们有一个 oracle O(Set S, int I) 可以一步计算子集和问题(也就是说,S 中是否有元素的子集总和为 I)?
然后,我们可以编写一个多项式时间算法来计算我们的半子集问题:
HalfSubset(Set S):
accum = 0
for each s in S:
accum+=S
end for
if(accum%2==1)
// this question forbids "splitting" values to non-integral parts
return NO_ANSWER
end if
half1 = O(S, accum/2)
if(half1 == NO_ANSWER)
return NO_ANSWER
end if
for each i in half1:
linear search for an element with the same value as half1[i] in S
delete it from S.
end for
half2 = S
return (half1 and half2)
如果我在这个过程中犯了任何错误,谁能告诉我?这是我期末考试复习中的一个问题,我不确定我是否完全理解。
【问题讨论】:
标签: algorithm np-complete reduction np