数据结构每日更新——第一天:算法

1.算法的特性:有穷性、确定性、可行性、输入、输出

2.算法的设计的要求:正确性、可读性、健壮性、高效率和低存储量需求

3.算法的度量方法:事后统计方法(不科学)、事前分析估算能力

4.算法时间复杂度

推导大O阶:

  • 用参数1代替加法参数
  • 在修改后的运行次数函数中,只保留最高阶项
  • 如果最高阶存在且不是1,则除去与这个项相乘的常数
得到的结果就是大O阶

5.常数阶

int main(){
    int sum=0,n=100; //一次
    sum = (1+n) * n/2; //一次
    printf("%d",sum);  //一次
}

时间复杂度为O(1)

6.线性阶

    int i;
    for(i=0;i<n;i++){
        printf("复杂度为O(1)的程序步骤!");
    }

时间复杂度为O(n)

7.平方阶

    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("复杂度为O(1)的程序步骤!");
        }
    }

时间复杂度为O(n^2)

第二种情况:
    int i,j;
    for(i=0;i<n;i++){
        for(j=i;j<n;j++){
            printf("复杂度为O(1)的程序步骤!");
        }
    }

这里i循环是n次,但是j循环里面逐渐减少。

i=1,j=n-1;i=2,j=n-2;……
可得到总执行次数为:n^2/2 + n/2
所以时间复杂度为O(n^2)

8.对数阶

    int count=1;
    while(count<n){
        count = count * 2;
        printf("复杂度为O(1)的程序步骤!");
    }

这里count每次乘以2,离n越来越近,有多少个2相乘后大于n,则会退出循环。由2^x=n得到x=log2(n)
时间复杂度为O(logn)

9.一般在没有特殊说明情况下,都是指定最坏时间复杂度

10.空间复杂度(不扩展,主要讲时间复杂度,以后再来看)

11.常见时间复杂度所耗时间排序:

O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)

    原文作者:TiHom
    原文地址: https://www.jianshu.com/p/19b7d919ca03
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞