同为O(Xⁿ)形式的指数阶大O表示法应当如何进行比较?
大O表示法「忽略常数」规则的适用边界解答
首先要先纠正你对「忽略常数」规则的误解:这个规则不是所有带常数的地方都能用,仅适用于两类场景:
- 完全与变量n无关的加性常数项:比如复杂度表达式末尾的
+5、+100这类固定值,在复杂度高于O(1)时可以直接忽略 - 与最高阶项直接相乘的常数系数:比如
O(3n)里的3、O(100n²)里的100,这类乘在最高阶项前面的常数可以忽略,不会改变复杂度的增长等级
接下来看你给出的几个复杂度,默认你写的5^3n是指数形式5^(3n)(如果是(5^3)*n的话属于线性复杂度,和你问的底数差异问题不匹配),先做等价变形:
O(5^(3n))可以转换为O((5^3)^n) = O(125^n)O(5^(3n)+5)里的+5是加性常数,直接忽略后等价于O(125^n)O(3^(5n))可以转换为O((3^5)^n) = O(243^n)- 剩下的
O(15^n)、O(5^n)无需变形,就是底数为15和5的指数复杂度
你之前的推导错误在于把指数里的常数、指数的底数都当成了可以忽略的常数,这是完全不成立的:
指数函数的增长等级完全由底数决定,只要底数a > b > 1,那么O(a^n)的增长速度就会远远快于O(b^n),且差距会随着n的增大呈指数级拉大。比如n=5时:
5^5 = 312515^5 = 759375125^5 = 3.05e10243^5 = 8.47e11
仅仅n=5的情况下,最高和最低的复杂度已经差了8个数量级,实际运行时的耗时差距会大到根本不在一个可比维度。
总结:你列的这几个复杂度完全不是同一等级,底数的差异会导致实际运行效率出现天差地别的区别,指数场景下不要滥用「忽略常数」的规则。
内容的提问来源于stack exchange,提问作者sarctechie
相关产品推荐
相关产品推荐

