[专业知识001] 算法设计与分析

算法时间复杂度

Ben 2024/01/23

🏡 More records...

Get the knowledge flowing and circulating! :)

目录

算法 & 算法复杂度

算法是解决某个问题的计算方法和步骤,是一个计算过程,这个过程中会包括一系列解决问题的清晰指令。

算法复杂度是指算法在编写成可执行程序后运行时所需要的时间资源和内存资源。程序的时间开销内存开销分别使用时间复杂度空间复杂度描述。

时间复杂度

概念

一般来说,时间复杂度是一个关于问题规模 n 的函数,记作 T(n)

例1:在计算1+2+3+...+n 的代码中,T(n)的表达式如下。

image-20231224101910913

image-20231224101922809

T(n)是n的一次函数

例2:代码功能是(11+12+...+1n)+(21+22+...+2n)+...+(n1+n2+...+nn)

image-20231224102653634

T(n)是n的二次函数

在大多数情况下,分析算法的时候,我们并不需要精确的计算出 T(n) 的函数表达式,我们只需要研究算法在最坏情况或者平均情况下的算法复杂度,另外如果问题规模 n 是一个很小的数字,那么显然就没有必要讨论解决该问题的时间复杂度了。

分析方法

所以,通常情况,我们在研究某个算法时,输入的时间规模 n 满足 n>>1,即,n 是一个非常大的数字。这里需要引入描述时间复杂度的三种最常使用的符号:O, Ω, Θ

O:代表时间复杂度的渐进上界

Ω:代表时间复杂度的渐进下界

Θ:代表时间复杂度的渐进确界


对于大部分的算法分析,我们只需要关注算法的渐进上界,即,使用 O 表示算法复杂度。

这是因为,大家在使用算法的时候,几乎不会考虑下界Ω的,因为如果人们说,请设计一个O(n)的算法,大家希望得到的算法满足最坏情况下不超过O(n),如果这个时候设计出一个O(logn)的算法,肯定也是满足需求的。人们也不会表达说,需要 n但不需要logn的算法;这种情况换一种说法,当人们说,这种算法是O(nlogn)的时候,希望表达的是这个算法至少是O(nlogn),不会比O(nlogn)差(比如,O(n2))。

算法时间复杂度排序:O(1) < O(logn) < O(n) < O(nloglogn) < O(nlogn) < O(n2)

总结 所以,我们在分析算法时间复杂度的时候,能够将算法使用 O 表示就行了。在表示的过程中,我们会忽略公式中的低阶项、常量和系数,只记录最大阶的量级,所以我们在分析算法时间复杂度的时候,只关注循环执行次数最多的那一段代码就可以了

例如:在下面这段代码中,c1, c2, c9都是常量级执行时间;c3, c4, c8对应 n ;c5, c6, c7对应 n2 。我们重点要分析c5, c6, c7这一段,最后得到整体的时间复杂度为 O(n2)

image-20240124143501840

image-20240124143517029

虽然说,代码千差万别,但是常见的时间复杂度并不多。

常见算法时间复杂度

通常情况下,这些算法时间复杂度可以覆盖全部面试中可能碰到的问题的时间复杂度

image-20231223213549386

总结来说,经典算法中最常出现的算法复杂度是O(1), O(logn), O(n), O(nlogn), O(n2)这5个,而掌握算法复杂度最好的方法就是掌握各类经典算法的实现方法,并且通过练习来熟练掌握。

image-20231223214317489

常见的5种算法时间复杂度

image-20240106115234218