zoukankan      html  css  js  c++  java
  • 曾经学的那些表示时间复杂度的公式怎么来的?

    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
  • 相关阅读:
    如何检索某个字段在sqlserver中的哪个些存储过程中?很简单的SQL语句。
    如何去掉HTML代码来获取纯文本?
    ajax实现跨域请求
    ajax实现跨域提交
    lab3
    Lab2
    hw2
    Homework1
    Lab1
    CS61B_学习计划和进程
  • 原文地址:https://www.cnblogs.com/kknote/p/14059194.html
Copyright © 2011-2022 走看看