快速搞懂算法复杂度

算法复杂度用于评估程序的效率,包括时间复杂度(描述执行时间)和空间复杂度(描述所需内存)。时间复杂度关注最高阶项,如选择排序的时间复杂度为O(N²)。空间复杂度则关注运行时所需的内存空间。不同数据状况可能影响算法的实际表现,如插入排序在某些情况下优于其最坏情况的时间复杂度。
摘要由CSDN通过智能技术生成

1. 复杂度

算法复杂度是帮助开发者评估算法优劣程度的评价指标。算法复杂度分为时间复杂度和空间复杂度。

1.1 时间复杂度

从时间维度出发,执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。简单来说,就是一个程序的运行时间。

时间复杂度受数据以及算法策略影响。通常来说,暴力解法的算法复杂度相对较高,也是最不考虑的算法。

需要注意的是,通常在进行时间复杂度分析时,我们只考虑最高阶的变元。原因如下:

例如,当我们在对一个长度为N的数组进行选择排序时间复杂度的分析时。

假设数组为[48 12 61 3 5 19 32 7 24 31]

第一次遍历:目的是确定下标为0的位置的数。

首先设min=下标为0的数,也就是min=48,然后48依次与后面的每一个数进行对比。如下图。

此时min=3,所以0下标的数跟3对换,就变成如下图。

经过第一次遍历,数组变成[3 12 61 48 5 19 32 7 24 31]。此时数组中最小的数已经在正确的位置了。

第一遍遍历对比了N-1次;

第二遍遍历从下标为1的位置开始,依次与后面的数进行比较,确定最小值放在下标1位置,此时对比了N-2次;

第三遍遍历从下标为2的位置开始,依次与后面的数进行比较,确定最小值放在下标2位置,此时对比了N-3次;

……以此类推;

最后一次遍历从下标为8的位置开始,与下标为9的数对比,确定最后两个下标的数,此时对比了1次。

所以整个选择排序一共对比了N-1+N-2+……+2+1次。整理一下就是aN²+bN+c。

当N是一个很大很大超级大的数的时候,能影响最后结果的只有N²,无论常数a、b、c多么大,在N²面前都不值一提。或许你会说那如果N不大呢,比如10N²+100000000000N+10,此时N更影响最后结果。但是!!因为时间复杂度对于我们来说通常只讨论最坏情况,所以我们假设N无限大,所以在时间复杂度上,我们只考虑阶数最大的那个变元。比如例子中的N²。

那这里就不得不补充一个知识点了。

我们使用时间复杂度的符号一般为O(),他表示这个算法的最差情况的时间复杂度。比如例子中的时间复杂度就是O(N²)。同时还有θ(),表示平均情况下的时间复杂度;Ω()表示最好情况下的时间复杂度。

同时,当指标无法确定时,我们需要实际去运行程序才能确定一个程序的时间复杂度情况。也就是说,不同的数据状况会影响算法的表现。比如插入排序的时间复杂度为O(N²),但当待排序的数组并不怎么需要调整位置的时候,它的时间复杂度低于O(N²);而冒泡排序和选择排序不管数据状况怎么样,时间复杂度都是O(N²)。

1.2 空间复杂度

从空间维度出发,执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。简单来说,就是一个程序运行所需要的空间,比如我们只设置了一个变量a或者两个变量等有限个数的变量时,那么这个程序的空间复杂度就是1,也就是说有限个数的变量空间我们默认为1;又比如为了实现选择排序,我们通常需要一个新的变量空间去记录当前找到的最小值/最大值。

作者:ee在努力
链接:https://juejin.cn/post/7236345420426706999
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值