Time complexity 枚举所有子集的时间余度 for(i=0;i

Time complexity 枚举所有子集的时间余度 for(i=0;i,time-complexity,Time Complexity,如果我理解正确: 迭代已排序的n数字集的所有子集。 对于您在O(n log n)中测试的每个子集,如果它是一个解决方案。(您如何执行此操作) 在你有了所有这些解决方案后,你会寻找一个具有最小和的精确S元素的解决方案 按照您编写它的方式,复杂性将是O(2^n*n logn)*O(log(2^n))=O(2^n*n^2 logn)O(log(2^n))=O(n)用于搜索最小解,在最坏的情况下,您在for循环的每一轮中都这样做i=n/2,每个子集都是一个解 现在我不确定你是不是把O()和O()混在一起

如果我理解正确:

迭代已排序的
n
数字集的所有子集。
对于您在
O(n log n)
中测试的每个子集,如果它是一个解决方案。(您如何执行此操作)
在你有了所有这些解决方案后,你会寻找一个具有最小和的精确
S
元素的解决方案

按照您编写它的方式,复杂性将是
O(2^n*n logn)*O(log(2^n))=O(2^n*n^2 logn)
O(log(2^n))=O(n)
用于搜索最小解,在最坏的情况下,您在for循环的每一轮中都这样做
i=n/2
,每个子集都是一个解

现在我不确定你是不是把
O()
O()
混在一起了。
2^no(nlogn*n)=O(2^nn²)
只有在您的意思是
2^no(nlog(n*n))
时才是正确的
f=O(g)
表示
f
的复杂度不大于
g
的复杂度
f=o(g)
表示
f
的复杂度小于
g
的复杂度

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

注意:
O(g)=O(h)
从来都不是一个好的符号。如果
g=O(h)
,你(很可能每次)会发现一个函数
f
f=O(h)
,但是
f!=O(g)

改进:
如果我对你的算法理解正确,你可以加快一点速度。你知道你要查找的子集的大小,所以只查看所有大小为
S
的子集。最坏的情况是
S=n/2
,因此
C(n,n/2)~2^(n-1)
不会降低复杂性,但会为你节省一个因子2。

您也可以只保存一个解决方案,然后检查下一个解决方案是否更小。这样,您就可以得到最小的解决方案,而无需再次搜索。因此,复杂性将是
O(2^n*n log n)

我无法理解您发布的“代码”我想枚举大小I的所有子集。大小I的每个子集都取o(nlogn)要解决。从所有这些大小子集中,我想找到最小成本。希望现在清楚了,你想解决什么?大小s的最小子集是什么?如果你要查找的子集是contais元素,那么最小值是包含的数字的总和?需要o(nlogn)多少开始时?你先对它们排序吗?是的,开始时我想对它们进行排序。此操作需要o(nlogn)。子集包含S个元素,最小值是包含的数字之和。所有问题的答案都是肯定的。我假设在最坏的情况下,集合的大小为n。枚举大小为S的所有子集(oCn,1Cn,2Cn,….nCn).2^no(nlogn)*o(n):测试解决方案花费o(nlogn)并搜索最小花费o(n)。2^no(nlogn)*o(n)=o(2^nnnlogn)>o(2^n n^2)。这种复杂性必须是=o*(2^n)。如果你现在没有任何解决方案的最小大小,你是对的。那么你必须枚举所有子集。你所说的复杂性是什么“这个复杂度必须是=O*(2^n)”?哪个复杂度?集合上的问题的复杂度必须是O*(2^n)参照链接部分子集问题O(p(n)*2^n)=O*(2^n),其中p(n)是一个多项式函数这是
p(n)=n^2 log n
的情况。但并非集合上的所有问题的复杂度都是
O(2^n)
。如果您想检查您的集合中是否有一对
(a,b)
,对于任何固定
c
,复杂性仅为
O(n^2)
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.
}