一、复杂度

时间复杂度

时间复杂度,就看带有未知数的循环执行了对少步。

1、O(longN)

2、O(N)

3、 O(NlogN)

4、O(N^2)

越往下越复杂

算法的执行时间输入值之间的关系

常见时间复杂度:O(1)、O(N)、O(logN)、O(NlogN)、O(M+N)、O(N^2)

O(1) < O(logN) (二分查找) < O(N) < O(NlogN) (排序)< O(N^2) < O(2^n) < O(n!)

在这里插入图片描述

O(1):

// 执行常数次,和输入num无关
public static int O1(int num){
    int i = num;
    int j = num*2;
    return i+j;
}

O(N):

public static int ON( int num){
    int total = 0;  // 执行这条语句时间需要 a
    // 执行整个for语句时间需要 num*b
    for (int i = 0; i < num; i++) {  
        total += i;   // 执行这条语句时间需要 b
    }
    return total;  // 执行这条语句时间需要 c
}
// 忽略常数,时间复杂度为:num
// 即:O(N)

O(logN):

public static int OlogN(int num){
    int i =1;
    // 执行整个whiler语句时间需要 b*log_2(num)
    while(i<num){
        i = i*2;  // 执行这条语句时间需要 b
    }
    return i;
}
/* 
i = 1*2*2*2*2.....
循环次数:x
2^x < num
x = log_2(num)

// 时间复杂度为:b*log_2(num)
// 忽略常数:O(logN)

O(M+N)

public static int OMN(int num1,int num2){
    int total = 0;
    for (int i = 0; i < num1; i++) {
        total += i;
    }
    for (int j = 0; j < num2; j++) {
        total += j;
    }
    return total;
}

O(NlogN)

public static int ONlogN(int num1,int num2){
    int total = 0;
    int j = 1;
    for (int i = 0; i < num1; i++) {
        while(j<num2){
            total = i+j;
            j = j*2;
        }
    }
    return total;
}

O(N^2)

public static int ON2(int num){
    int total = 0;
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            total = i+j;
        }
    }
    return total;
}

// O(N^2 + n)   --n无限大--> O(N^2)
public static int ON2(int num){
    int total = 0;
    for (int i = 0; i < num; i++) {  // O(N^2)
        for (int j = 0; j < num; j++) {
            total = i+j;
        }
    }
    
     for (int i = 0; i < num; i++) {  // O(N)
        total += i;   
    }
    return total;
}

空间复杂度

算法存储空间输入值之间的关系

常见的空间复杂度:O(1) < O(N) < O(N^2)

看变量

常量看其与输入值得关系
递归要考虑递归栈

O(1)

//变量实常数,所占空间,与输入值无关
public static int O1(int num){
    int total = 0; //常量
    for (int i = 0; i < num; i++) {
        total+= i;
    }
    return total;
}

O(N)

// 变量是array、linked、list、递归..,可以存多个数据,是随着输入值的改变而改变。
public static int[]  ON(int num){
    int[] arr = new int[num];          //变量用数组去存了
    for (int i = 0; i < num; i++) {
        arr[i] = i;
    }
    return arr;
}

public static int getResult(int n){
    if(n<0){
    	throw new ValidateException("非法参数");
    }
    if(n==1 || n==0){
        return 1;
    }
    return getResult(n-1)*n;
}

时间和空间只能二选一

面试时和面试官讲清楚

工作:时间>空间

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值