【Java数据结构重点知识】第二节:时间和空间复杂度

一:总述

1.如何衡量一个算法的好坏

        时间复杂度和空间复杂度

2.算法效率

(1)算法效率分析分为两种:第一种是时间效率(时间复杂度),第二种是空间效率(空间复杂度)

(2)时间复杂度主要衡量算法的运行速度,空间复杂度主要衡量一个算法所需要的额外空间

(3)时间复杂度主要算次数,空间复杂度主要算开辟变量的个数

3.大O渐进法

(1)在实际计算时间和空间复杂度的时候,不需要算精确值,所以我们可以采用大O渐进法

(2)步骤:

        1)用常数1代替运行时间中的所有加法常数

        2)在修改后的运行次数函数中,只保留最高阶数

        3)如果最高借存在且不为1,则去除与这个最高项相乘的常数

二:常见时间复杂度例子

1.O (N)

//计算fun1的时间复杂度
void fun1(int N){
    int count=0;
    for (int i = 0; i <2*N; i++) {
        count++;
    }
    int M=10;
    while((M--)>0){
        count++;
    } 
    System.out.println(count);
}

2.O (N+M)

void fun2(int N,int M){
    int count = 0;
    for (int i = 0; i < N; i++) {
        count++;
    }
    for (int j = 0; j  
  

3.O(N^2)

//计算冒泡排序的时间复杂度
void bubbleSort(int[] array){
    for (int i = 0; i < array.length-1; i++) {
        boolean flg=true;
        for (int j = 0; j array[j+1]){
                int temp=array[j];
                array[j]=array[j+1];
                array[j+1]=temp;
                flg=false;
            }
        }
        if(flg==true){
            break;
        }
    }
}

4.O (log2N)

//计算二分查找的时间复杂度
int binarySearch(int[] array,int value){
    int begin=0;
    int end=array.length-1;
    while(begin<=end){
        int mid=begin+((end-begin)/2);
        if(array[mid]value){
            end=mid-1;
        }else
            return mid;
    }
}

5.O (2^N)

//计算斐波拉契的时间复杂度
int fib(int N){
    return N<2?N:fib(N-1)+fib(N-2);
}

6.O(N) 

//计算阶乘递归的时间复杂度
long factorial(int N){
    return N<2?N:factorial(N-1)*N;
}

三:常见空间复杂度例子

1.O(1)

//计算冒泡排序的空间复杂度
void bubbleSort(int[] array){
    for (int i = 0; i < array.length-1; i++) {
        boolean flg=true;
        for (int j = 0; j array[j+1]){
                int temp=array[j];
                array[j]=array[j+1];
                array[j+1]=temp;
                flg=false;
            }
        }
        if(flg==true){
            break;
        }
    }
}

2.O(N)

//计算斐波拉契的空间复杂度
int fib(int N){
    return N<2?N:fib(N-1)+fib(N-2);
}

3.O(N)

//计算阶乘递归的空间复杂度
long factorial(int N){
    return N<2?N:factorial(N-1)*N;
}

你可能感兴趣的:(Java,大学知识杂库,数据结构)