据我了解,有两个步骤可以证明问题是NP完成的:
提供一种算法,可以在多项式时间内验证问题的解决方案。也就是说,一种算法,其输入是问题的建议解决方案,根据输入是否是问题的有效解决方案,其输出为“是”或“否”。
证明问题是NP很难 - 例如,假设你有一个oracle可以一步计算另一个已知的NP完全问题。使用它,编写一个在多项式时间内解决这个问题的算法。
例如,假设我们想要证明以下问题是NP Complete:
给定一组整数S
,是否可以隔离元素子集S'
,使S'
中元素的总和恰好等于总和S
中未包含在S'
中的其余元素?
第1步:验证算法
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)
有人可以告诉我,如果我在这个过程中犯了错误吗?这是我期末考试的一个问题,我不完全确定我完全理解。
答案 0 :(得分:3)
不,这是不正确的。您可以设置一个使用NP-Complete oracle来解决问题的情况,但问题本身仍然存在于P.
您需要做的是表明您可以针对您的问题减少另一个NP-Complete问题。也就是说,提供一个多项式时间算法来将特定NP-Complete问题的任何实例转换为您的问题实例,这样您(转换)问题的解决方案也是给定NP-Complete问题的解决方案。这表明如果你可以解决你的问题,那么你也可以解决任何NP-Complete问题,这意味着你的问题至少与任何其他NP-Complete问题一样困难。
答案 1 :(得分:3)
你答案的第二部分有点偏。你在第二步中说的是你可以在多项式时间内将这个问题简化为一个已知的NP完全问题。也就是说,你说这个问题最多和NP完全问题一样难。
你想说的是NP完全问题可以在多项式时间内减少到你的例子问题。这表明,如果你能在多项式时间内解决这个问题,那么你也可以在多项式时间内解决NP完全问题,证明你的例子问题是NP完全的。