文章目录

  • 1.算法效率
  • 2.时间复杂度
  • 大O渐近表示法
  • 3.空间复杂度


1.算法效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间

2.时间复杂度

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间

大O渐近表示法

计算时间复杂度和空间复杂度时,为了估算一个算法的耗时情况,不需要计算出精确的执行次数,只需要计算到一个大概的计算次数次数即可,我们使用大O渐近表示法
O()->是一个函数渐近的数学符号
1.常数1表示所有的加法常数 1000或者10000只保留1
2.最后的大O函数只保留最高项,N^ 2+N+100只保留N^2
3.若最高阶还有系数,去除系数,3N^ 2或者2N^ 2只保留N^2

java 执行js 效率 java的效率_递归函数

此时一共执行次数为:N^2+2N+10

时间复杂度:O(N^2)

java 执行js 效率 java的效率_递归函数_02


此时执行次数:N+M,由于无法判断N和M的大小,所以时间复杂度:O(N+M)

java 执行js 效率 java的效率_java_03


此时执行次数100次,时间复杂度:O(1)

千万看到有N就是O(N)

java 执行js 效率 java的效率_递归函数_04


这个算法在下一次循环时起始位置或者末位置就变成了区间的一半,每次变为原先的一半,执行次数:O(logN)

任意算法,如果不断/任意数字,最终等于1或者0,这个算法的时间复杂度就是O(logN)

一个算法能做到对数级别那么一定是一个优秀的算法

一个递归函数的时间复杂度,要展开这个递归函数,看递归了多少次

int fun6(int n) {
return n<2?n:fun6(n-1)*n;
}

一共递归了n-1次,这个算法的时间复杂度O(n)

斐波那契函数的递归

int fun7(int n) {
return n<2?1:fun7(n-1)+fun7(n-2);
}

计算这个递归函数的时间复杂度比较特殊,递归次数是二叉树的结点个数2^n -1
时间复杂度为O(2^n)

重点掌握O(1)O(n)O(n^2)O(logn)O(nlogn)

最坏情况的时间复杂度:这个算法的最大运行时间
最好情况的时间复杂度:这个算法的最小运行时间
平均情况的时间复杂度:这个算法的平均运行时间
当前数组的个数为n,从头开始遍历,如果所需的元素在末尾就是最坏情况的时间复杂度O(n),如果所需的元素在第一个就是最好情况的时间复杂度O(1),如果所需的元素在中间就是O(n/2)

3.空间复杂度

所谓空间复杂度指的是算法中”额外”开辟的内存空间

计算空间复杂度也使用大O渐近法

一般来说空间复杂度就看算法中有没有开辟”数组”空间

java 执行js 效率 java的效率_java_05


像这种没有额外开辟内存的就是O(1)

long[] fun8(int n) {
long[] arr = new long[n+1];//在堆开辟了一个长度为n+1的数组就是O(n)
arr[0] =0;
arr[1] = 1;
    for (int i = 2; i < n; i++) {
        arr[i] = arr[i-1]+arr[2];

        
    }
    return arr;
}

开辟了一个长度为n+1的数组就是O(n)

当只定义了几个临时变量,O(1)
定义了一些变量,而且这些变量的个数与N有关
int[] data = new int[n] => O(n)

递归函数每次函数调用过程,就对应一个函数的”栈帧”在栈中的入栈过程,递归函数调用几次,就需要开辟多少个栈帧空间

java 执行js 效率 java的效率_递归函数_06


这个递归函数递归了n-1次,空间复杂度:O(n)

void fun9(int n) {
if(n==1) {
    return;
}
int[] arr = new int[n];
fun9(n-1);
}

这个递归函数会调用n次,每次调用开辟一个长度为n的数组
空间复杂度:O(n^2)