0

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

list          =>         [1, 2, 3]
combinations  =>         [{1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}]

该算法将花费 O(2 n ) 时间复杂度来生成所有组合。但是,我不确定改进的算法是否可以降低时间复杂度。如果存在改进的算法,请分享您的知识!

如果它需要 O(2 n ) 是指数的,我想了解一下这个算法属于 P、NP、NP-Complete 或 NP-Hard 的哪个类。提前致谢 :)

4

2 回答 2

1

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

人们经常将FNP中的问题通俗地称为 NP 中的问题。这个问题也不存在于 FNP 中,因为关系的输出字符串的长度必须受输入长度的某个多项式函数的限制。这可能是 FNP 难的,但我们正在进入即使是研究生 CS 教育也无法涵盖的杂草。如果您足够关心,值得在 CS Stack Exchange 上询问。

于 2020-10-20T12:51:16.717 回答
-1

除了可以说是 NP-hard 之外,他们都没有这个问题。

它不在 P 中,因为没有多项式时间算法可以做到这一点。您不能在多项式时间内生成指数数量的事物。

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

它不是 NP 完全的,因为 NP 完全中的所有东西都必须在 NP 中,而事实并非如此。

它在 NP-hard 中的论点是这样的。你可以对空集的成员说任何你想要的东西。包括它们让猴子从你的鼻子里飞出来,并且可以在多项式时间内解决 NP 中的任何问题。所以如果我们能找到一个多项式的解决方案,我们就可以快速解决任何 NP 问题,因此它满足 NP-hard 的定义。但没用 - 我们知道不存在多项式解决方案。

于 2020-10-20T04:19:51.867 回答