计算机系统应用教程网站

网站首页 > 技术文章 正文

第002讲:算法与时间复杂度的基本概念

btikc 2024-10-28 13:10:18 技术文章 5 ℃ 0 评论

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。

那么我们应该如何去衡量不同算法之间的优劣呢?

主要还是从算法所占用的「时间」「空间」两个维度去考量。

时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。

空间维度是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。(目前由于电子产品升级,我们不重视空间内存了,只考虑时间维度)

一、时间复杂度

时间复杂度:简单的来讲就是把编写的程序运行一遍所需要的时间,但是程序运行时间的长短与计算机的性能有关系,所以为了排除计算机性能对程序运行时间所需要时间的影响,我们引入一种表示方法:「 大O符号表示法 」,即 T(n) = O(f(n))

我们先来看个例子:

通过「 大O符号表示法 」,这段代码的时间复杂度为:O(n) ,为什么呢?

在 大O符号表示法中,时间复杂度的公式是:T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式的全称是:算法的渐进时间复杂度。

我们认为每个程序行执行一次就需要一次时间,那么我们可以知道当for循环执行一次的时候,里面的语句则执行一次,那么当for循环执行N次的时候,for循环内套结构执行2*N次了,从这个结果可以看出,如果N无限大的时候,T(n) = time(3*N)中的倍数3也意义不大。因此直接简化为T(n) = O(n) 就可以了。

二、常见的算法计算:

1.常数阶O(1)

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1),如:

上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。

2.线性阶O(n)

这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

3.对数阶O(logN)

从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n也就是说当循环 log2n,这个代码就结束了。因此这个代码的时间复杂度为: O(logn)

4. 线性对数阶O(nlogN)

线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

5.平方阶O(n2)

平方阶O(n2) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n2) 了。如果将其中一层循环的n改成m,即:

参考上面的O(n2) 去理解就好了,O(n3)相当于三层n循环,其它的类似。

本文参考资料:

《程序与算法》

《大话数据结构》

《算法的艺术》

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表