数据结构与算法之复杂度(2):最好,最坏,平均,均摊复杂度

浅析最好,最坏,平均与均摊时间复杂度

先看下面在数组中查找某个数据的代码:

int find(int[] array, int n, int x) {
  int i = 0;
  int pos = -1;
  for (; i < n; ++i) {
    if (array[i] == x) {
       pos = i;
       break;
    }
  }
  return pos;
}

如果数组中第一个元素正好是要查找的变量 x,那就不需要继续遍历剩下的 n-1 个数据了,那时间复杂度就是 O(1)。但如果数组中不存在变量 x,那我们就需要把整个数组都遍历一遍,时间复杂度就成了 O(n)。所以,不同的情况下,这段代码的时间复杂度是不一样的。

最好时间复杂度:在最理想的情况下,得到的时间复杂度。就比如说要查找的元素是数组中的第一个。
最坏时间复杂度:在最差的情况下,要查找的数据不在数组内,那就需要将数据都要遍历一遍。
平均时间复杂度:最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大,所以就出现了平均时间复杂度。
还是上面那段代码,我们还分析一下,当要查找的变量x,在数组中的某个位置,0~n-1之间或者不在数组中,就一共有n+1种情况。所以,将每种出现的情况次数加起来除以总的情况就得到平均时间复杂度,用大O表示法,去掉系数,低阶,常量等,O((1+2+3+…+n+n)/(n+1)) =O(n)。

均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值