程序员总要跨过去的坎:时间复杂度

编程/开发
306
0
0
2022-05-14

从本科计算机专业第一次接触时间复杂度,到现在读研还是读的计算机,对于时间复杂度还是半懂不懂的状态,今天又来回顾一次,不求完全搞懂,但求对其有更深的理解,以后学以致用!

程序员总要跨过去的坎:时间复杂度

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。

程序员总要跨过去的坎:时间复杂度

但是光有以上三种求法是远远不够的,因为有时候我们会遇到更复杂的算法,这时候就需要用到两个求时间复杂度的定理:

1、分治法主定理

2、问题规模见效和递归求解主定理

首先先要了解增长率,所谓增长率就是随着输入规模的增加,算法运行时间增加的速度,他是输入规模的函数。

常用的增长率:

程序员总要跨过去的坎:时间复杂度

增长率

然后我们来一个一个地讲时间复杂度的求法:

大O表示法

大O表示法给出了函数f(n)的严格上限。一般来说,它可以表示为f(n)=O(g(n))。这表示当输入规模很大时,f(n)的上界是g(n)。

大O表示法的定义为,O(g(n))={f(n):存在这样的正常数c和n0使得对任意的n>=n0,0<=f(n)<=cg(n)成立},则g(n)是f(n)的渐近上界。目的是求出大于或等于f(n)的g(n)。

举例说明:

程序员总要跨过去的坎:时间复杂度

程序员总要跨过去的坎:时间复杂度

程序员总要跨过去的坎:时间复杂度

程序员总要跨过去的坎:时间复杂度

程序员总要跨过去的坎:时间复杂度

以上就是时间复杂度的三个基础求法,接下来介绍两个定理,帮助我们求复杂的算法的时间复杂度。

分治法主定理

所谓的分治法主定理是把一个问题划分为多个子问题,每个子问题是原问题的一部分,然后执行一些额外的工作来计算最后的答案。下面给出运行时间计算公式:

程序员总要跨过去的坎:时间复杂度

程序员总要跨过去的坎:时间复杂度

分治法定理的相关问题:

程序员总要跨过去的坎:时间复杂度

程序员总要跨过去的坎:时间复杂度

问题规模减小和递归求解主定理

程序员总要跨过去的坎:时间复杂度

例题:

程序员总要跨过去的坎:时间复杂度

程序员总要跨过去的坎:时间复杂度

素材来源:《数据结构与算法 经典问题解析 java语言描述》[印]纳拉辛哈.卡鲁曼希

排版比较乱,图片也拍得不是很好,请大家见谅