数据结构与算法-复杂度

463 阅读2分钟

1,什么是算法?

  • 算法是用于解决特定问题的一系列的解决步骤
  • 例如:
  •   //计算a和b的和
      public static int plus(int a,int b){
          return a + b;}
      
      //计算1+2+3+...+n的和
      public static int sum(int n){
       int result = 0;
      for(int i = 0; i < n; i ++){
         result += i;
      }
      return result;
      }
    

2,使用不同的算法,解决同一个问题,效率可能会相差很大

  • 例如:波那契数: (0,1,1,2,3,5,8,13,21,34,55.........n ),前两个数相加的和做为第三个数,依次类推

  • 求第n个波那契数:

    //方法一 public static int fib1(int n){ if(n <= 1) return n; //第(n-1)和 第(n-2)相的和就是第n个斐波那契数 return fib1(n - 1) + fib1(n - 2); } 复杂度:O(2^n)

    //方法二 public static int fib2(int n){ if(n <= 1) return n;

    int first = 0;//第一个数
    int second = 1;//第二个数
    for(int i = 0; i < (n - 1);i ++){
        int sum = first + second;
        first = second;//把第二个数付给第一个
        second = sum;//把求的和付给第二个
    }
    return second;//返回第二个的值
    

    } 复杂度:O(n)

3,如何评价一个算法的好坏?

3.1,一般从以下的维度进行判断

  • 正确性,可读性,健壮性
  • 时间复杂度:估算程序指令的执行次数(估算执行的时间)
  • 空间复杂度:估算程序所需占用的空间

3.2,大O表示法

  • 一般用大O法来表示复杂度,他表示数据模型n对应的复杂度

  • 注意:大O法只是一种初略的分析模型,是一种估算,帮助我们在短时间内了解一个算法的执行效率。

3.3,对数的复杂度处理

  • 对数一般忽略底数

3.4,常见的复杂度

4,斐波那契数时间复杂度的分析

4.1,方法一

//方法一
public static int fib1(int n){
    if(n <= 1) return n;
    //第(n-1)和 第(n-2)相的和就是第n个斐波那契数
    return fib1(n - 1) + fib1(n - 2);
}
复杂度:O(2^n)

4.2,方法二

//方法二复杂度计算
public static int fib2(int n){
    if(n <= 1) return n;

    int first = 0;
    int second = 1;

    // 1 + (n - 1)+ n
    for(int i = 0; i < (n - 1);i ++){
        int sum = first + second;
        first = second;//把第二个数付给第一个
        second = sum;//把求的和付给第二个
    }
    return second;//返回第二个的值
}
复杂度:O(n)

一、在for循环计算复杂度:

  1. int i = 0;    复杂度为:1
  2. i < n - 1;    复杂度为:n - 1
  3. i ++;          复杂度为:n

二、for循环里面计算复杂度:

  • 里面复杂度为:n

所以复杂度为:1 + n - 1 + n + n= 3n , 忽略系数,所以复杂度为:O(n)