显示以下代码在Θ(nlogn)时间

时间:2016-02-12 16:31:09

标签: algorithm time big-o analysis

这是一个家庭作业问题,我真的需要帮助,我希望有人帮我解决这个问题

  

我们有n个电灯泡,标签从1到n。光明   灯泡最初全部关闭。每个灯泡都有一个开关,所以   翻转开关会将其状态从ON更改为OFF,或者   从OFF到ON。在第i轮,对于i = 1,2,....,n,我们将翻转   那些标签是i和我们的倍数的灯泡的开关   有兴趣知道在第n个之后哪个灯泡将打开   回合。

     

我们可以使用以下方法计算每个灯泡的最终状态   代码:

Intialize A[1...n] so that each entry is OFF;
for(round i=1,2,...,n) {
  for (position j=i,2i,3i,...){
    if(j<=n) Flip A[j];
    else break;
  }
}
     
      
  1. 显示obove代码在O(n ^ 2)时间内运行

  2.   
  3. 显示上述代码在Θ(nlogn)时间内运行。

  4.   
  5. 设计一个更快的算法,可以在O(n)时间内计算最终状态。
  6.   

1 个答案:

答案 0 :(得分:0)

对于从i1的每个n,内部循环在Θ(n / i)时间内运行。因此整个运行时间为Θ(n / 1 + n / 2 + ... + n / n)

现在只能使用1 / 1 + 1 / 2 + ... + 1 / n = Θ(log(n))这个众所周知的事实。这样就完成了问题的第1部分和第2部分。

要获得更快的算法,请尝试针对某些小n(例如n = 100)进行实验。什么是最后打开的灯泡?你能从结果中猜出什么?最后,你能证明你的猜测吗?