数据结构与算法之美(个人笔记)- 算法性能分析_复杂度分析(下)

本人在购买极客学院王争老师的《数据结构与算法之美》后,觉得里面的内容还不错,适合新手入门,故将自己的学习笔记整理了下,做个记录,供学习使用,另里面存在个人理解,难保会有差错,欢迎大家在评论区讨论,侵删。
极客学院专栏地址:https://time.geekbang.org/column/intro/126?gk_activity=0


笔记目录: https://blog.csdn.net/lxfHaHaHa/article/details/101039494


时间复杂度又分为最好情况时间复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度(average case time complexity)、均摊时间复杂度(amortized time complexity)

一个例子:

// n 表示数组 array 的长度 
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有可能在数组里面,也可能不在数组里面,最好的情况是在第一个位置就找到了,最坏的情况要最后一位,即:

  • 最好情况时间复杂度:O(1) — 第一位就找到
  • 最坏情况时间复杂度:O(n) — 要全部遍历完
  • 平均情况时间复杂度:有两种可能,在或者不在,在的话,n个位置都有可能,分别是1/2n的可能性,分别要走1到n步;不在的话,是1/2的可能,时间复杂度是n。故如下:
    数据结构与算法之美(个人笔记)- 算法性能分析_复杂度分析(下)_第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(1),最坏为O(n),平均为:
在这里插入图片描述
均摊:每一次 O(n) 的插入操作,都会跟着 n-1 次 O(1) 的插入操作,所以把耗时多的那次操作均摊到接下来的 n-1 次耗时少的操作上,均摊下来,这一组连续的操作的均摊时间复杂度就是 O(1)。这就是均摊分析的大致思路。
均摊总结:对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。

你可能感兴趣的:(数据结构与算法之美)