算法+数据结构(时间,空间复杂度)

复杂度分析:

 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))。

均摊时间复杂度和摊还分析应用场景比较特殊,所以我们并不会经常用到。为了方便你理解、记忆,我这里简单总结
一下它们的应用场景。如果你遇到了,知道是怎么回事儿就行了。
对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这
些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复
杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,
一般均摊时间复杂度就等于最好情况时间复杂度。

算法导图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值