数据结构与算法---均摊时间复杂度

数据结构与算法—均摊时间复杂度

均摊时间复杂度,听起来可能和平均时间复杂度。但却不是,平均时间复杂度和均摊时间复杂度是两种分析时间复杂度的方法。

上代码!!!

 // array 表示一个长度为 n 的数组
 // 代码中的 array.length 就等于 n
 int[] array = new int[n];
 int count = 0;
 void insert(int val) {
 if (count == array.length) {
 int sum = 0;
 for (int i = 0; i < array.length; ++i) {
 sum = sum + array[i];
 }
 array[0] = sum;
 count = 1;
 }
 array[count] = val;
 ++count;
 }

这段代码实现的是往数组里插入数据的功能。当数组满了的时候,我们用for循环遍历数组求和,并清空数组,将求和后的sum值放在数组的第一个位置上,然后往数组的空位里添加新的数据。

这段代码的时间复杂度是多少呢?我们很容易知道最好情况复杂度是O(1)。最坏情况复杂度为O(n)。平均时间复杂度是O(1)。

但是均摊时间复杂度是多少呢?首先我们需要明白均摊这一词义,均摊就代表着,将一次高复杂度的情况均摊到低复杂度的情况上。

首先,find()函数在极端情况下,复杂度才是O(1)。但是insert()大部分情况下,时间复杂度都是O(1。只有个别情况下复杂度才会较高,为O(n)。这是find和insert其中一个不同点。

其次呢,对于insert函数来说,O(1)时间复杂度的插入和O(n)时间复杂度的插入,出现的频率是很有规律的,而且有一定的前后时序关系,一般是一次O(n)插入后,紧跟着n-1个O(1)的插入操作,一直循环往复。

所以,针对这种特殊的场景我们需要用到均摊时间复杂度,它的别名叫做摊还分析法。

 // array 表示一个长度为 n 的数组
 // 代码中的 array.length 就等于 n
 int[] array = new int[n];
 int count = 0;
 void insert(int val) {
 if (count == array.length) {
 int sum = 0;
 for (int i = 0; i < array.length; ++i) {
 sum = sum + array[i];
 }
 array[0] = sum;
 count = 1;
 }
 array[count] = val;
 ++count;
 }

我们看代码例子很容易就能看出其规律,每次O(n)插入操作后,都有着n-1次O(1)的插入操作,所以把耗时多的那次操作均摊到n-1上,均摊下来后均摊时间复杂度就是O(1)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值