algorithm - 这段代码的最坏情况时间复杂度是多少?
问题描述
我在课堂上有一个小测验,但做得不太好。我正在寻找是否有人可以向我解释我在这里做错了什么——当我们搬到网上时,我们的教授忙于办公时间,所以我想我会在这里发帖。
def functionA(n):
level = n
total = 0
while level > 1:
for i in range(0,n):
level = level // 2
total = total + i
return total
我的回答:上面的函数是 O(log n) 因为for
循环在每次迭代中将 level 变量分成两半。
我得到了 5/10 分,但它并没有真正解释它的错误或正确之处。我做错了什么,为什么?
用于证明测验已评分并返回的图片。只是想弄清楚。
解决方案
问题是这一行:
for i in range(0,n):
因为n
和level
是两个完全独立的变量,它们是副本n
并且n
永远不会改变,所以这个循环总是 O(n)。
一旦我们确定内循环是 O(n),我们需要弄清楚外循环的复杂性。
在外循环的第一次迭代中,内循环重复设置level = level // 2
. 由于这个赋值会很快减少level
到 1,所以外循环保证在第一次迭代后终止,使其成为常数时间。
for
对于内部循环的单次迭代,我们的整体复杂度为 O(n) 。
推荐阅读
- python - Python列表分配索引超出范围错误
- php - 不推荐使用整数注册日期声明,请改用 DateTimeImmutable 对象
- c - 带有 goto 的扩展 asm,包括来自 gcc 文档的示例,无法编译
- r - 在重叠条形图中为每个变量绘制多条正态曲线
- python - Pandas Dataframe 计算每天的时差
- javafx - 将样式表添加到 javafx.scene.Scene 与查看 javafx.scene.Parent 有什么区别?
- docker - 在 docker-compose 中进行本地绑定挂载
- java - 从代表某些工作日的 ENUM 中获取 ENUM 值的好方法是什么
- c++ - int(*)[] 类型的参数与“int**”类型的参数不兼容
- javascript - 如何使用 Puppeteer 将变量定义为抓取的元素