算法中的复杂度(先做个铺垫)


定义与分类

复杂度:衡量算法效率的标准
时间效率:衡量这个算法的运行速度,也就是我们常说的时间复杂度
空间效率:衡量这个算法所需要的额外空间,也就是我们常说的空间复杂度

时间复杂度

概念

在计算机科学中,算法的时间复杂度是一个函数,它定量的描述了该算法的运行时间。
一个算法执行所耗费的时间,从理论上说是不能算出来的,只有你把你的程序放在机器上跑起来才能知道,但是我们需要每个算法都需要上机测试吗?那样是不是很浪费时间,还很麻烦,所有才有了时间复杂度这个分析式。
一个算法所花费的时间与其中语句执行的次数成正比,算法中基本操作的执行次数,为算法的时间复杂度

大O的渐进表示法

一般我们用大O的渐进法来表示时间复杂度,并给出了一个问题的规模,这个规模我们统称为N
推导方法

  1. 用常数1取代运行时间中的所有加法函数
  2. 在修改后的运行次数函数中,只保留最高阶限
  3. 如果最高阶存在且不是1,去掉最高项的系数

得到的结果就是大O阶
简单的说时间复杂度就是一个和数据量有关,只要高阶项,不要低阶项,不要常数项的操作次数表达式

举例

1.选择排序

public void selectSort(){
    int[] arr = {1,5,9,6,3};
    for (int i = 0; i < arr.length -1; i++) {
            for (int j = i; j < arr.length -1; j++) {
                if (arr[i] >arr[j+1]){
                    int temp = arr[i];
                    arr[i] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
}

第一次:索引从0到N-1过一遍选出最小值,循环次数为N
第二次:索引从1到N-1过一遍选出最小值,循环次数为N-1
第三次:索引从2到N-1过一遍选出最小值,循环次数为N-2
依次类推…
第N次:索引从N-1到N-1过一遍选出最小值,循环次数为1
循环次数为(N+N-1+N-2+…+1),为等差数列
我们知道等差数列最后的结果为 A N 2 + B N + C AN^2+BN+C AN2+BN+C
根据推导方法我们得出选择排序的时间复杂度为 O ( N 2 ) O(N^2) O(N2)
2.插入排序
这里插入一个知识点:严格固定流程的算法,一定强调最差情况!
插入排序中,被进行排序的数组可以是有序数组,也可以是无序数组。
有序数组中,数组插入一次,进行比大小,不需要换位置,所以最后的时间复杂度为 O ( N ) O(N) O(N);在无序数组中,可以是随机无序,最坏的情况就是一个降序数组,但是你需要一个升序的数组,数组插入一次,就要与前面交换位置,前面几个元素就要交换几次,时间复杂度为1+2+3+…+N为 O ( N 2 ) O(N^2) O(N2),那最后插入排序的时间复杂度到极为多少呢?
遇到这种情况,因为插入排序的代码是固定的,所以称为固定流程的算法,我们要用最差情况来计算时间复杂度,所以插入排序的时间复杂度为 O ( N 2 ) O(N^2) O(N2)

情况

  1. 算法流程上利用随机行为作为重要部分的,要看平均或者期望的时间复杂度,因为最差的时间复杂度无意义(生成相邻值不同的数组)
  2. 时间复杂度的均摊,(动态数组,N个数的时间复杂度为 O ( N ) O(N) O(N),那么一个数的时间复杂度为 O ( 1 ) O(1) O(1))

注意

  1. 不要用代码结构来判断时间复杂度,比如只有一个while循环的冒泡排序,时间复杂度为 O ( N 2 ) O(N^2) O(N2)
  2. 不要用代码结构来判断时间复杂度,比如N/1+N/2+…+N/N,这个流程的时间复杂度为 O ( N ∗ l o g N ) O(N*logN) O(NlogN)调和级数
  3. 时间复杂度只能是对算法流程充分理解才能分析出来的,而不是简单的看代码结构!
  4. 时间复杂度很重要,可以直接判断某个方法能不能通过一个题目,根据数据量猜解法

内涵

描述算法运行时间和数据量的关系,而且当数据量很大很大时,关系相当的本质,排除了常熟时间的干扰

空间复杂度

实现该算法所需的额外空间

最优解

先满足时间复杂度最优,然后尽量少用空间的解

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Zeal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值