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²)
??
答案 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)
。