算法分析两种解法正确性与差异 渐近类归属问题咨询
算法复杂度习题解答
疑问A:两种解法的正误与差异
解法1相关说明
解法1的代码逻辑为i每次加4,循环执行次数为⌈n/4⌉+1,和输入规模n成线性正比,所有单次操作都是常数阶O(1),因此整体时间复杂度的紧确界为Θ(n),上界为O(n),结论基本正确,仅写法Θ = O(n)不够严谨:Θ是紧确渐近界,O是上界,二者概念不同,规范写法应为时间复杂度为Θ(n)或O(n)。
解法2的错误
解法2存在三处核心错误:
- 代码逻辑本身有问题:i初始值为0,每次执行
i = i *4后i仍为0,只要n≥0就会进入死循环,不存在有限的执行次数 - 循环次数计算错误:哪怕修正初始值为1(避免死循环),i每次乘4的增长速度是指数级,循环次数为log₄(n),属于对数阶,远低于线性阶n,它标注的循环开销n完全不符合实际
- 渐近复杂度概念错误:Θ描述的是输入规模趋近于无穷时的增长阶,需要忽略常数系数和低阶项,哪怕假设它的操作数计算是对的,3n+2的渐近阶也是Θ(n),不能把常数和系数写进Θ的结果里
二者本质差异是对应的代码迭代逻辑完全不同,解法1是线性增长的迭代,解法2是指数增长的迭代(还存在死循环bug),且解法2对渐近复杂度的概念应用完全错误。
疑问B:print语句的开销是否需要计算
所有执行语句的开销原则上都需要纳入统计,但渐近复杂度分析只关注最高阶的增长项:
- 像本题中打印单个变量的print属于O(1)常数阶操作,最终会被更高阶的项覆盖,算进去也不影响最终的复杂度结论
- 如果print本身的开销和输入规模相关(比如打印长度为n的数组、打印n个字符),那它的开销就需要纳入最高阶项的计算,直接影响最终复杂度结果
内容的提问来源于stack exchange,提问作者user14736790
相关产品推荐
相关产品推荐

