目录
时间复杂度计算实例
示例一
在Func2函数中通过for循环和while循环可得时间复杂度函数T(N) = 2N + 10,根据推导大O规则得到O(N)
示例二
在Func3函数中通过两个for循环可得时间复杂度函数T(N) = M + N,根据推导大O规则得到O(M + N)
此时如果M >> N,则为O(M)
此时如果M << N,则为O(N)
此时如果M == N,则为O(M + N)
示例三
在Func4函数中通过for循环可得时间复杂度函数T(N) = 100,根据推导大O规则得到O(1)
注意:这里的1不是运行一次,而是代表的常数。
示例四
strchr执⾏的基本操作次数:
①若要查找的字符在字符串第⼀个位置,则:T (N) = 1
②若要查找的字符在字符串最后的⼀个位置,则:T (N) = N
③若要查找的字符在字符串中间位置,则:T (N) = N / 2
所以我们可以看出T(N)取决于查找的位置
因此:strchr的时间复杂度分为:
最好情况: O(1)
最坏情况: O(N)
平均情况: O(N / 2)
另外特别要注意的一点是:大O通常关注的是最差的情况,因此strchr的时间复杂度:O(N)
通过上⾯我们会发现,有些算法的时间复杂度存在最好、平均和最坏情况。
(1)最坏情况:任意输⼊规模的最⼤运⾏次数(上界)
(2)平均情况:任意输⼊规模的期望运⾏次数
(3)最好情况:任意输⼊规模的最⼩运⾏次数(下界)
⼤O的渐进表⽰法在实际中⼀般情况关注的是算法的上界,也就是最坏运⾏情况。
示例五
(1)若数组有序,则:T (N) = N
(2)若数组有序且为降序,则:T (N) = N ∗ (N + 1) / 2
因此:BubbleSort的时间复杂度取最差情况为: O(N^2)
示例六
我们可以先假设几个数
当n=2时,执⾏次数为1;当n=4时,执⾏次数为2;当n=16时,执⾏次数为4
假设执⾏次数为 x ,则 2x = n
因此执⾏次数:x = log n
因此:func5的时间复杂度取最差情况为:O(log n)
这几种写法都是正确的,但是一般建议使用log n(其实也有一个原因是因为键盘输入不了底数)
另外要注意的一点是:当n接近⽆穷⼤时,底数的⼤⼩对结果影响不⼤。因此,⼀般情况下不管底数是多少都可以省略不写,即可以表⽰为 log n
示例七
调⽤⼀次Fac函数的时间复杂度为 O(1)⽽在Fac函数中,存在n次递归调⽤Fac函数
因此:阶乘递归的时间复杂度为: O(n)
空间复杂度计算实例
因为如今内存的存储量已经很大,满足我们正常使用,所以我们一般不会去要求空间复杂度。但这不意味着我们使用空间时就可以随便浪费,只能说相对没有过多的限制。
示例一
函数栈帧在编译期间已经确定好了,只需要关注函数在运⾏时额外申请的空间。
BubbleSort额外申请的空间有exchange等有限个局部变量,使⽤了常数个额外空间
因此空间复杂度为 O(1)
示例二
Fac递归调⽤了N次,额外开辟了N个函数栈帧,每个栈帧使⽤了常数个空间
因此空间复杂度为: O(N)
示例三
通过动态申请内容也会涉及到空间复杂度的计算
空间复杂度为: O(N)