枚举所有子集的时间复杂度

时间:2014-07-16 21:21:31

标签: time-complexity

for (i=0;i<n;i++)
{
   enumerate all subsets of size i = 2^n
   each subset of size i takes o(nlogn) to search a solution
   from all these solution I want to search the minimum subset of size S.
}  

我想知道这个算法的复杂性,它是2^n O(nlogn*n)=o(2^n n²) ??

1 个答案:

答案 0 :(得分:0)

如果我理解你的话:

您迭代一组有序n个数字的所有子集 对于您在O(n log n)中测试的每个子集,如果它是一个解决方案。 (你怎么这样做)
在您拥有所有这些解决方案之后,您将寻找具有精确S元素且具有最小总和的那个。

你写它的方式,复杂性是O(2^n * n log n) * O(log (2^n)) = O(2^n * n^2 log n)O(log (2^n)) = O(n)用于搜索最小解,并且在最坏情况i=n/2的每一轮for循环中执行此操作,并且每个子集都是解决方案。

现在我不确定你是否混合了O()o() 如果您的意思是2^n O(nlogn*n)=o(2^n n²)2^n O(nlog(n*n))是正确的 f=O(g)表示f的复杂程度不大于g的复杂程度 f=o(g)表示f的复杂程度小于g的复杂程度。

所以2^n O(nlogn*n) = O(2^n n logn^2) = O(2^n n * 2 logn) = O(2^n n logn) < O(2^n n^2)

注意O(g) = o(h)永远不是一个好的表示法。如果f,您将(最有可能每次)找到f=o(h) f != O(g)g=o(h)的函数。

改进
如果我理解你的算法正确,你可以加快一点。您知道要查找的子集的大小,因此只需查看大小为S的所有子集。最糟糕的情况是S=n/2,因此C(n,n/2) ~ 2^(n-1)不会降低复杂性,但会为您节省2倍 您也可以保存解决方案并检查下一个解决方案是否更小。通过这种方式,您可以获得最小的解决方案而无需再次进行修复因此复杂性为O(2^n * n log n)