复杂度分析(下)最好、最坏、平均、均摊时间复杂度分析

  • 最好、最坏、平均复杂度分析

这段代码要实现的功能是,在一个无序的数组(array)中,查找变量x 出现的位置。如果没有找到,就返回 -1。这段代码的复杂度是 O(n)。

我们在数组中查找一个数据,并不需要每次都把整个数组都遍历一遍,优化后的代码如下:

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

我们假设在数组中与不在数组中的概率都为 1/2。另外,要查找的数据出现在 0~n-1 这 n 个位置的概率也是一样的,为 1/n。所以,根据概率乘法法则,要查找的数据出现在 0~n-1 中任意位置的概率就是 1/(2n)。

去掉系数和常量,这段代码的平均时间复杂度仍然是 O(n)。

 

  • 均摊时间复杂度

当数组没满时,插入操作很快,只需要执行1次赋值操作即可,时间复杂度为O(1)。当数组已满,需要扩容为原来的两倍,然后将元素数组中的值拷贝到新数组中,假如原数组长度为n,则需要进行n此操作,时间复杂度退化为O(n)。每当经历n次时间复杂度为O(1)的操作时,便经历1次时间复杂度为O(n)的操作, 整个插入操作的均摊时间复杂度就变为O(1)了。这就是摊还分析的大致思想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值