时间复杂度计算

例1:

for(int i = 1;i<=n;i*=2)
{
  for(int j = 1;j<=n;j++)
  p--;
}

时间复杂度:O(n*log2n

内层循环改为 <=i 

时间复杂度:O(n2)    1+2+3...+n 等差数列前n项和

例二:

for(i = 1;i<=n;i++)
  for(j = 1;j<=i;j++)
    for(k = 1;k<=j;k++)
      p--;

时间复杂度:O(n3)

计算过程:

  1+(1+2)+(1+2+3)+(1+2+3+...)+...+..(1+2+3+...+n)

  i(i+1)/2 i从1到n 求和 n(n+1)(2n+1)/6 ???

递归的时间复杂度计算:递归的通式:T(n) = aT(n/b)+f(n)    n为数据规模

例3:T(n) = 3T(n/4)+cn2

时间复杂度:O(n2)

例4:T(n) = 2T(n/2)+1

时间复杂度:O(n)

简便算法:直接算O(nlogba )   和  f(n) 将这连个数比较 , 取结果大的一个

上面两个一样大的时候 结果为    O(nlogba  *  log2n)

名称       最好时间复杂度     平均时间复杂度     最坏时间复杂度   空间复杂度         稳定性
冒泡        O(n)正序          O(n^2)          O(n^2)逆序        O(1)           稳定
简单选择      O(n^2)         O(n^2)          O(n^2)          O(1)            不稳定
插入排序      O(n)正序         O(n^2)         O(n^2)逆序        O(1)           稳定
快排        O(n*log2 n)          O(n*log2 n)       O(n^2)有序/逆序最坏    O(log2 n)        不稳定
希尔(插入)      O(n)正序              O(n的(1.2~1.5))      O(n^2)逆序        O(1)           不稳定
归并(二路)      O(n*log2 n)                O(n*log2 n)       O(n*log2 n)       O(n)           稳定
堆排(选择)         O(n*log2 n)               O(n*log2 n)     O(n*log2 n)        O(1)           不稳定
基数排序      O(d*(n+r))                O(d*(n+r))         O(d*(n+r))       O(n+r)           稳定

注:

  空间复杂度 额外申请的空间 包括变量和动态申请的
  常量空间复杂度:如果我们额外申请的空间 不随着处理数据量的增大而增大 那么我们称这样的空间复杂度为常量空间复杂度记为O(1)

  稳定:数值相等的两个元素 在排序前后其相对位置未发生改变

  基数排序最稳定 d------位数 r--------桶的个数
  别的排序可能受人的写法影响稳定性
  归并排序 -----空间复杂度 如果申请了额外数组就是O(n) 没申请就是O(log2 n)
  堆排
  建立初始堆------ S = 2^(k-2)*1+2^(k-3)*2+...+1*(k-1) 错位相减 ----------------- O(n)
  排序------------- O(n*log2 n)

猜你喜欢

转载自www.cnblogs.com/Lune-Qiu/p/9158904.html