【问题标题】:Time complexity analysis using big-o使用 big-o 进行时间复杂度分析
【发布时间】:2016-02-23 09:12:52
【问题描述】:

修改后得出结论,时间复杂度其实是O(2^n)

问题是时间复杂度是多少?是 O(2^n) 还是?

我相信这是因为 for 循环被认为运行了 n 次。然后嵌套的 while 循环运行 2^n 次。第二个 while 循环运行 2^n 次。

Algorithm subsetsGenerator(T)     
Input:  A set T of n elements       
Output: All the subsets of T stored in a queue Q   {     

create an empty queue Q;      
create an empty stack S;     
let a1, a2, …,  an be all the elements in T;       
S.push({});    // Push the empty subset into the stack      
S.push({a1})         
for ( each element ai in T-{a1} )         
{ 
  while (S is not empty )                 
  {  
x=S.pop;                     
Q.enqueue(x);                        
x=x ∪ { ai };                     
Q.enqueue(x);                     
  }            

 if  ( ai is not the last element )                 
  while (Q is not empty )                     
  {  
  x=Q.dequeue();                         
  S.push(x);                         
  }          
 }    
} 

编辑:如果你想让我分解分析,请在下面评论。

【问题讨论】:

  • 你知道输出有多大吗?产生这么大的输出需要多长时间,一次将元素添加到输出中?你和你的朋友都分析错了。
  • 是的,我们仍在考虑它,但是我们正在使用一组 4 个元素对其进行分析。如果我们再看一遍,每个 while 循环给出 2^n,而 for 循环只给出一个 n。
  • 这里有问题吗?

标签: big-o


【解决方案1】:

对于 n 个元素的集合 T,子集的总数为 2^n。如果要将所有这些子集保留在 Q 中,则时间复杂度至少为 O(2^n)。


其实我认为 O(2^n) 是答案。

如果我正确理解您的算法,您将尝试对 T 中的每个元素 a_i 执行操作,取出 S 中的所有内容,将其放回 S 两次 - 一次没有 a_i,一次使用 a_i。

因此总时间复杂度是 (1+2+4+...+2^n) 乘以 C,C 代表弹出、入队、出队和推送的时间,即 O(1)。上面的项等于 2^(n+1)-1 仍然是 O(2^n)。

【讨论】:

  • 我相信它的 O(n(2^n))。我修改了我的分析。
  • @Mikeez 虽然您正在执行 n 次 for 循环,但每次循环的规模都不相同 - 它呈指数增长。
  • 是的,你的算法是正确的,我应该解释得更好。基本上,它采用一个集合,它会在最后输出所有子集。
  • @Mikeez 所以我认为是 O(2^n)
  • @Mikeez “它采用一个集合,它会在最后输出所有子集” - 我希望你有很多 RAM(或非常小的集合)。
猜你喜欢
  • 2022-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多