对数复杂度疑问:算法教材标注循环复杂度为O(log₂n)是否为笔误?
结论
你对这段代码的判断完全正确,它确实是死循环,不存在有限的时间复杂度,习题标注的O(log₂n)是错误的,大概率是书籍印刷/编写时的笔误。
为什么这段代码是死循环
- 代码中
i的初始值为0,for循环的增量表达式为i * 2:0乘以2的结果永远是0,且该表达式没有对i做赋值操作,i的值会一直保持为0,只要n>0,i < n的判断永远为真,循环永远不会终止。 - 你将它和
while(true)的死循环对比是完全合理的,两者都没有可触发的循环终止条件,逻辑完全一致。
原习题的正确考察意图
结合标注的O(log₂n)时间复杂度,原习题的代码存在两处笔误:
i的初始值应为1而非0- 增量表达式应为赋值操作
i *= 2而非单纯的乘法运算i * 2
修正后的代码如下:
function someFunc(n) { // 初始值设为1,增量改为赋值操作 for(var i = 1; i < n; i *= 2) { console.log(i); } }
修正后,i的取值会按1、2、4、8、16…的指数级增长,直到不满足i < n的条件,循环执行次数为⌊log₂n⌋次,时间复杂度为O(log₂n),这才是习题原本想要考察的对数复杂度知识点。
额外提示
技术书籍出现少量笔误是常见情况,你能精准识别出死循环的问题,说明你对循环执行逻辑的掌握是扎实的,不需要怀疑自己的判断。
内容的提问来源于stack exchange,提问作者user16373392
相关产品推荐
相关产品推荐

