这是一个家庭作业问题,我真的需要帮助,我希望有人帮我解决这个问题
我们有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; } }
显示obove代码在O(n ^ 2)时间内运行
显示上述代码在Θ(nlogn)时间内运行。
- 设计一个更快的算法,可以在O(n)时间内计算最终状态。
醇>
答案 0 :(得分:0)
对于从i
到1
的每个n
,内部循环在Θ(n / i)
时间内运行。因此整个运行时间为Θ(n / 1 + n / 2 + ... + n / n)
。
现在只能使用1 / 1 + 1 / 2 + ... + 1 / n = Θ(log(n))
这个众所周知的事实。这样就完成了问题的第1部分和第2部分。
要获得更快的算法,请尝试针对某些小n
(例如n = 100
)进行实验。什么是最后打开的灯泡?你能从结果中猜出什么?最后,你能证明你的猜测吗?