• 曾经学的那些表示时间复杂度的公式怎么来的?


    1. 常数阶
    O(1)
    Temp=i;
    i=j;
    j=temp;
    以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
    
    2. 线性阶
    a=0  ①
    b=1  ②
    for(i=1;i<n;i++)  ③
    {
        s=a+b;  ④
        b=a;  ⑤
        a=s;  ⑥
    }
    语句1的频度:1
    语句2的频度:1
    语句3的频度:n
    语句4的频度:n-1
    语句5的频度:n-1
    语句6的频度:n-1
    T(n)=O(f(n))=1+1+n+3(n-1)=4n-1=O(n)
    
    3. 平方阶
    # 交换i和j
    sum=0;  # 1
    for(i=1;i<=n;i++)  # n
    {
        for(j=1,j<=n,j++)  # n^2
        {
            sum++;  # n^2
        }
    }
    T(n)=1+n+n^2+n^2=2n^2+n+1=O(n^2)   # 去掉常数,低阶,高阶的系数
    
    4. 立方阶
    for(i=0;i<n;i++)
    {
        for(j=0;j<i;j++)
        {
            for(k=0;k<j;k++)
            {
                x=x+2;
            }       
        }
    }
    i,j,k 最大值均可以取到n-1,所以n-1的三次方为最大执行次数。所以时间复杂度为O(n^3)。
    
    5. 对数阶
    i=1;
    while(i<=n)
        i=i*2;
    假设i=n时刚好结束循环
    第1次:i=1*2=2
    第2次:i=2*2=2^2
       3: i=4*2=2^3
       4: i=8*2=2^4
      ...
       x: i=n=2^x
    x=log2n
    f(n)=log2n
    T(n)=O(log2n)
    

    在计算时间复杂度时,我们一般使用的大O表示法,其时间复杂度,从小到大的排序是:
    (1) < (logn)< (n)< (nlogn)< (n^2)<...< (2^n)< (n!)

    更多学习笔记移步 https://www.cnblogs.com/kknote
  • 相关阅读:
    LeetCode 222.完全二叉树的节点个数(C++)
    LeetCode 704.二分查找(C++)
    LeetCode 441.排列硬币(C++)
    LeetCode 981.基于时间的键值存储(C++)
    LeetCode 167.两数之和(C++)
    LeetCode 367.有效的完全平方数(C++)
    LeetCode 881.救生艇(C++)
    LeetCode 860.柠檬水找零(C++)
    LeetCode 870.优势洗牌(C++)
    bootstrap
  • 原文地址:https://www.cnblogs.com/kknote/p/14059194.html
Copyright © 2020-2023  润新知