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

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

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

上代码!!!

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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页