Algorithm 生成所有可能组合的分类和复杂性:P、NP、NP完全或NP难

Algorithm 生成所有可能组合的分类和复杂性:P、NP、NP完全或NP难,algorithm,time-complexity,p-np,Algorithm,Time Complexity,P Np,该算法需要从给定列表生成所有可能的组合(不包括空集) 该算法需要O(2n)时间复杂度来生成所有组合。然而,我不确定改进后的算法是否能降低时间复杂度。如果存在改进的算法,请分享您的知识 如果它取O(2n),它是指数的,我想了解一下这个算法属于p类、NP类、NP完全类还是NP难类。提前感谢:)这个问题除了可以说是NP难之外,其他问题都不存在 它不在p中,因为没有多项式时间算法。你不能在多项式时间内生成指数数量的东西 它不在NP中,因为没有多项式时间算法来验证答案。你不能在多项式时间内处理指数数量的事

该算法需要从给定列表生成所有可能的组合(不包括空集)

该算法需要O(2n)时间复杂度来生成所有组合。然而,我不确定改进后的算法是否能降低时间复杂度。如果存在改进的算法,请分享您的知识


如果它取O(2n),它是指数的,我想了解一下这个算法属于p类、NP类、NP完全类还是NP难类。提前感谢:)

这个问题除了可以说是NP难之外,其他问题都不存在

它不在p中,因为没有多项式时间算法。你不能在多项式时间内生成指数数量的东西

它不在NP中,因为没有多项式时间算法来验证答案。你不能在多项式时间内处理指数数量的事情

它不在NP完全中,因为NP完全中的所有东西都必须在NP中,而它不是


关于它是NP难的争论是这样的。你可以对空集的成员说任何你想说的话。包括它们让猴子飞出你的鼻子,可以在多项式时间内解决NP中的任何问题。因此,如果我们能找到多项式解,我们可以快速解决任何NP问题,因此它符合NP难的定义。但是毫无用处的是,我们知道不存在多项式解。

p、NP、NP完全和NP难都是决策问题的类别,其中没有一个包含涉及非二进制输出的问题(例如这个枚举问题)


人们通常用口语将中的问题称为NP。这个问题也不在FNP中,因为关系的输出字符串的长度必须由输入长度的某个多项式函数限定。FNP可能很难,但我们正陷入连研究生CS教育都无法覆盖的困境。值得在CS堆栈交换上询问您是否足够关心。

如果代码的目标是生成所有可能组合的列表,那么不可能比O(2^n)做得更好。算法的复杂度永远不能小于输出的大小。我认为最后一点是不正确的。即使我们暂时忽略了NP难与决策问题有关,问题中描述的问题的O(1)预言对多项式解决NP问题也没有任何帮助。@ADdV一个O(1)预言也无助于让猴子飞出你的鼻子。问题的关键是,你可以对空集的成员说任何你想说的话。当然,我的观点是,一个问题是NP难的,当且仅当一个oracle机器与该问题的oracle可以在多项式时间内解决NP中的任何问题。NP硬度的定义与猴子和鼻子无关。
list          =>         [1, 2, 3]
combinations  =>         [{1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}]