目录
1、常数阶
这个是跟问题规模没有关系的,不会随着n增大而执行次数增多。
比如这种简单的变量赋值
2、对数阶
这个是对数阶是因为,首先公式 i = i * 2 可以带入几个数进去,且定义的是从i开始,那么我们就可以得出:
i = 1,2,4,8,16...,n
可以看出,这里就是2的倍数关系是吧。就是
所以这里要求的就是第几次的x对吧,或者说是执行多少次x
根据对数的公式:
==>
不过算出来公式 i = i * 2 的执行次数之后,还有while(i <= n)的执行次数跟上面的 int i =1的执行次数对吧
首先 i = i * 2 要跳出循环,怎么跳?当然就是 执行完 x = 再+1 那 i 不就大于while(i <= n)里的n了吗?所以 i = i * 2执行的次数是
,
如果不知道我说什么你可以试试代一个数进去,比如我代入 n=8,那么 x =3对不对?那这里还没有跳出循环啊,所以再执行一次,x = 4 的时候才算数跳出循环,所以就是要 + 1
然后就到我们的循环while(i <= n)这里,外循环执行的次数,跟循环体执行的次数一样这个没有问题吧?但是!这里还有搞清楚一个问题,就是我们比如我们的 i > n 之后,是直接执行到下一步吗?当然不是,我们还得再判断一次 i 是不是真的大于n 对吧。所以就是
还有一个 int i = 1; 这里只执行一次,接下来再根据加法规则:多项相加,保留最高阶,并将系数化为1。
3、线性阶
int x = 1;跟 int i = 1; 都是只执行一次。
然后把 for 循环跟他的循环体分成4部分
x ++; 执行的次数为 n,不懂就带入数字自己算一遍
i <= n 的次数就是比循环体多一次,因为 i > n 之后再判断一次 i 是不是真的大于n
i ++ 的次数也是n,不懂就自己带入数字自己算一遍
那么加法法则
4、线性对数阶
while(x <=n){x = x * 2}这里时间复杂度已经知道是
然后for循环我们也知道他的时间复杂度是O(n)
不过这里不一样的就是我们的这个循环是嵌套的,外面for循环每执行一次,里面while就需要执行次。那么外面执行了n次的话,里面就是执行了
这么多次。
所以根据我们的乘法规则:多项相乘都保留,并将系数都化为1
不过别忘了还有for循环的时间复杂度,再根据加法乘法混合规则,那么时间法则度就为
5、平方阶
原理跟线性对数阶是一样的,只不过是for套for,外面for循环时间复杂度为O(n),里面的时间复杂度是外面的for循环执行一次,里面就执行O(n)次,外面执行O(n)次里面就执行O(n²)次(O(n)*O(n)=O(n²));
所以根据加法乘法混合规则:T(n)=1+O(n)+O(n²)=O(n²),时间复杂度就是O(n²)
1是int x=1;的次数
6、立方阶
原理也是跟线性对数阶,平方阶一样的,这里我就不多赘述了,第一次for执行一次,第二层for就执行O(n)次,第三层就执行O(n²)次;第一次for执行n次,第二层for就执行O(n²)次,第三层就执行O(n³)次
根据加法乘法混合规则:T(n)=1+O(n)+O(n²)+O(n³)=O(n³)
习题巩固
例题1、
解析:直接根据加法乘法混合规则,
加法规则:多项相加,保留最高阶,并将系数化为1。
乘法规则:多项相乘都保留,并将系数都化为1
最高阶是是O(n²)时间复杂度为T(n)=O(n²)
例题2、
解析:这里渐进分析可以看成时间复杂度,根据
可知,这里面最高的是阶乘阶,然后再到指数阶,对数阶lgn最小,直接选D