复杂度分析:
1,时间(渐进时间复杂度)
2,空间(渐进空间复杂度)
复杂度分析方法:
1,加法法则:总复杂度等于量级最大的那段代码的复杂度
2,只关注循环执行次数最多的一段代码
3,乘法法则,嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
PS:我们通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了
例如:
T(n) = O(4n2+5n+3) =O(去掉系数4和5,常量3,结果为O(n2),2为平方)
T(n) =O(log3n)=O(logn),去掉底数3。
对数阶时间复杂度:
T(n)=O(logn)(忽略对数的底,系数,例如:y=log3n(相当于n=3y),其中系数3忽略)
如果一段代码的时间复杂度是O(logn),那么循环N边的话,那么复杂度变为O(nlogn),
根据乘法复杂度来的。
时间复杂度:O(m+n)、O(m*n)
当决定复杂度是由2个规模(2个参数)的来决定的时候,下面2中都适用:
1,T(m)+T(n)=O(f(m)+f(n))
2,T(m)*T(n)=O(f(m)*f(n))
空间复杂度:
申请的常量不计算空间。例如:int i=0;
紧紧计算new的。 例如:int【】 a=new int【n】,这个复杂度也就是O(n)。
空间复杂度一般也就:O(1)、O(n)、O(n平方,立方。。。)
没有时间复杂度那么复杂。
浅析最好、最坏、平均、均摊时间复杂度:
四个复杂度分析方面的知识点:
1,最好情况时间复杂度(best case time complexity)、O(1)
2,最坏情况时间复杂度(worst case time complexity)、O(n)
3,平均情况时间复杂度(average case time complexity)、O( (3n+1)/4)=O(n)去掉系数
4,均摊时间复杂度(amortized time complexity)。O( n/(n+1))=O(1)去掉系数
平均情况时间复杂度:
我们知道,要查找的变量 x,要么在数组里,要么就不在数组里。这两种情况对应的概率统计起来很麻烦,为了方便
你理解,我们假设在数组中与不在数组中的概率都为 1/2。另外,要查找的数据出现在 0~n-1 这 n 个位置的概率
也是一样的,为 1/n。所以,根据概率乘法法则,要查找的数据出现在 0~n-1 中任意位置的概率就是 1/(2n)。
因此,前面的推导过程中存在的最大问题就是,没有将各种情况发生的概率考虑进去。如果我们把每种情况发生的概
率也考虑进去,那平均时间复杂度的计算过程就变成了这样:
这个值就是概率论中的加权平均值,也叫作期望值,所以平均时间复杂度的全称应该叫加权平均时间复杂度或者期望
时间复杂度。
引入概率之后,前面那段代码的加权平均值为 (3n+1)/4。用大 O 表示法来表示,去掉系数和常量,这段代码的加权
平均时间复杂度仍然是 O(n)。
均摊时间复杂度:
摊还分析(或者叫平摊分析)。
假设数组的长度是 n,根据数据插入的位置的不同,我们可以分为 n 种情况,每种情况的时间复杂度是 O(1)。除此之外,还有一种“额外”的情况,就是在数组没有空闲空间时插入一个数据,这个时候的时间复杂度是 O(n)。而且,这 n+1 种情况发生的概率一样,都是 1/(n+1),
复杂度:O(n/(n+1))。
均摊时间复杂度和摊还分析应用场景比较特殊,所以我们并不会经常用到。为了方便你理解、记忆,我这里简单总结
一下它们的应用场景。如果你遇到了,知道是怎么回事儿就行了。
对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这
些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复
杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,
一般均摊时间复杂度就等于最好情况时间复杂度。
算法导图: