zoukankan      html  css  js  c++  java
  • 时间复杂度与空间复杂度

    时间复杂度 Time Complexity : 代码执行的次数

    O(1)-----常量 函数体执行3次printf


    O(n) 一个for循环 3*n+2次,只取最高次幂,并且把系数去掉,所以是O(n)


    O(nlog2 n) --------log以2为底 n的对数,外层循环次数*内层    
    for(int i = 1;i<=n;i*=2)
    {
      for(int j = 1;j<=n;j++)
      p--;
    }

    O(n^2)---------- 把上面的内层循环里面的n改成i++

    例题
    for(i = 1;i<=n;i++)
      for(j = 1;j<=i;j++)
        for(k = 1;k<=j;k++)
          p--;
    1+(1+2)+(1+2+3)+(1+2+3+...)+...+..(1+2+3+...+n)即为1+3+6+10+...+i*(i+1)/2

    把1/2提出去,变成i^2+i,从1累加到n

    1^2+2^2+3^2+...+n^2 = n(n+1)(2n+1)/6

    所以时间复杂度为O(n^3)

    递归的时间复杂度

    递归式通式 T(n) = aT(n/b)+f(n)
    n : 数据规模

    a : 递归的叉数

    b : 递归中传进n的个数,比如b=2代表每次递归传了n的长度的一半的参数,b还影响着递归的层数,因为当n/b=1时就不能继续递归了
    1.递归树法 

      T(n) = 3T(n/4)+cn^2
      层数 K = log4 n + 1 以4为底

      上面的是cn^2*(1+3/16+(3/16)^2+...+(3/16)^k-2) = (16/13)cn^2

      最后一层是n^(log以4为底3的对数),两个相加上面的次幂高,所以是O(n^2)

      T(n) = 2T(n/2)+1

      层数 K = log2 n + 1 以2为底

      上面的是1+2+4+8+..+2^k-2 = n-1

      最后一层是n,加起来是2n-1,所以是O(n^2)
    2.主方法
      直接算O(n的logb a 和f(n)进行比较,谁大取谁,一样大为 O(n的logb a * log2 n))

      第一个题n^log4 3和cn^2比较后者幂次高,取后者所以是O(n^2)

      第二个题n和1比前者幂次高,取前者所以是O(n)

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

    基数排序:最稳定的排序方法,其他排序方法可能受算法的影响

    d------位数    r--------桶的个数

    位数决定了要入桶出桶几次

    入桶的循环次数是有多少个变量也就是n

    出桶的循环次数是有多少个桶也就是r

    所以时间复杂度是O(d*(n+r)),由于是拉链法所以是一个指针数组,空间大小为O(n+r)

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

      名称 最好时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性
    1 冒泡排序 O(n)正序的时候 O(n^2) O(n^2)逆序的时候 O(1) 稳定
    2 选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定
    3 插入排序 O(n)正序的时候 O(n^2) O(n^2)逆序的时候 O(1) 稳定
    4 快速排序              O(n*log2 n)每次都可以二分      O(n*log2 n)      O(n^2)有序/逆序最坏    O(log2 n)  不稳定
    5 希尔排序  O(n)正序的时候  O(n的(1.2~1.5))  O(n^2)逆序的时候  O(1)  不稳定
    6 归并排序   O(n*log2 n)   O(n*log2 n)   O(n*log2 n)  O(n) 稳定 
    7 堆排序  O(n*(log2 n))  O(n*(log2 n))  O(n*(log2 n))  O(1)  不稳定
    8 基数排序  O(d*(n+r))  O(d*(n+r))  O(d*(n+r))  O(n+r)  稳定

        

     稳定性的问题 :

    9 5 4 2 5,第一次选择排序后,相同元素的位置发生了交换,所以不稳定

    2 5 5 3 4,选4做标准值,到3的时候,第一个5和三交换了位置,所以不稳定

     根据规律总结,隔着很多元素交换的排序都不稳定

     

    堆排序的时间复杂度计算:

    堆排序分为创建初始堆和调整的过程

    1.创建初始堆

    设最后一层为k,那么倒数第二层有2^(k-2)个节点,倒数第三层有2^(k-3)个节点

    倒数第二层的节点需要比较一次,倒数第三层的节点需要比较两次

    所以     S = 2^(k-2)*1+2^(k-3)*2+2^(k-4)*3 + ....+ 1*(k-1)  由于是等差*等比,用乘公比错位相减

     2S =  2^(k-1)*1+2^(k-2)*2+2^(k-3)*3 + ... + 2*(k-1)

    所以S =  2^k+k-3

    又因为是完全二叉树所以 k =  log2 n + 1

    所以创建初始堆的时间复杂度为O(n)

    2.排序

    元素的长度为n要循环n次,然后循环中调整的次数为log2 n次

    所以排序的时间复杂度为O(n*(log2 n))

    整体的时间复杂度为他们两个相加,所以为O(n*(log2 n))

  • 相关阅读:
    简易自制线程池(备忘)
    大数据量的删除过程查看
    收集书籍备忘
    6月12日C代码
    fseek()
    区分int *p[4]与int (*p)[4]
    常用的字符串处理函数 C语言
    6月11日
    C学习代码
    文件读取 C语言
  • 原文地址:https://www.cnblogs.com/TheQi/p/9159001.html
Copyright © 2011-2022 走看看