复杂度分析(下)

1.复杂分析度算法

复杂分析度又分为数组

最好状况时间复杂度(best case time complexity):在最理想的状况下,执行一段代码的时间复杂度.数据结构

最坏状况时间复杂度(worst case time complexity):在最糟糕的状况下,执行一段代码的时间复杂度.学习

平均状况时间复杂度(average case time complexity)每种状况下执行的次数与几率的积的累和.it

均摊时间复杂度(amortized time complexity):均摊时间复杂度就是一种特殊的平均时间复杂度。for循环

 

2.最好状况时间复杂度和最坏状况时间复杂度数据结构与算法

  // n 表示数组 array 的长度
1  int find(int[] array, int n, int x) {
2  int i = 0;
3  int pos = -1;
4  for (; i < n; ++i) {
5  if (array[i] == x) {
6  pos = i;
7  break;
8  }
9  }
10 return pos;
11 }循环

首先看到for循环,肯定4~7行这段代码来肯定时间复杂度.可是这又分为两种状况.查找的x存在数组中.查找的x不存在数组中.im

当x存在数组中是这段代码的时间复杂度是O(1),当x不存在数组中时须要循环整个数组.时间复杂度就是O(n).因此这就须要数据

最好状况时间复杂度(best case time complexity)、最坏状况时间复杂度(worst case time complexity)平均状况时间复杂

度(average case time complexity)来表示一段代码的复杂度.

 

3.平均状况时间复杂度

上面这段代码的的最好状况时间复杂度,和最坏时间复杂分析度都是在极端状况下出现的复杂分析度.发生的几率并不大.

既然有了最好和最坏,那就会有平均状况时间复杂度.那么上面这段代码的平均状况时间复杂分析度为1+2+3..+n/n+1=n(n+3)/2n+1.

(每种状况下要循环查找出想x所在数组的个数除以总次数,获得的就是平均一次查找出x的循环的次数).又由于在大O标记法中.能够

省掉系数,低阶,常量.所平均状况时间复杂分析度为O(n).

可是这种状况并无把x是否存在数组中的几率,以及x处于数组中时x的位置的几率.因此把概论算上.正确的平均状况时间复杂度

1x1/2x1/n +2x1/2x1/n....+nx1/2xn/1 =3n+1/4,去掉系数,低阶常量等.最终平均时间复杂分析度仍是O(n).

这个值就是几率论中的加权平均值,也叫做指望值,因此平均时间复杂度的全称应该叫加权平均时间复杂度或者指望时间复杂度。

 

4均摊时间复杂度

  // 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).平均时间复杂分析度为每次插入的次数乘以几率并相加.即1x1/n+1...+n/n+1=

1+2+3..+n/n+1= (1+n)n/2  x   1/n+1  =n(1+n)/2(n+1)   .因此平均时间复杂分析度为O(n).

这段代码在通常状况下的时间复杂度都为O(1).只有当count==array.length是时间复杂度才为O(n).而且在执行此次时间复

杂度为O(n)以后(数组第一位为累加的和,其余数据清空)的n-1次的时间复杂度都为O(1).其实就是说我每执行n次这段代码

前n-1次的时间复杂度都为O(1).最后一次的时间复杂度为O(n).那平均一下 O(n)/n 不就是O(1)吗?这就是均摊时间复杂度(摊还分析法)

 

运用的场景:

对一个数据结构进行一组连续操做中,大部分状况下时间复杂度都很低,只有个别状况下时间复杂度比较高,并且这些操做之间存在

先后连贯的时序关系,这个时候,咱们就能够将这一组操做放在一起分析,看是否能将较高时间复杂度那次操做的耗时,平摊到其

他那些时间复杂度比较低的操做上。并且,在可以应用均摊时间复杂度分析的场合,通常均摊时间复杂度就等于最好状况时间复杂度。

 

 

 

本文是在学习王争老师的数据结构与算法之美的笔记.有些是王争老师或者评论的言语.在此附上原文连接

 https://time.geekbang.org/column/article/40447

相关文章
相关标签/搜索