如何计算算法的时间复杂度(算法与时间复杂度的基本概念)
如何计算算法的时间复杂度(算法与时间复杂度的基本概念)通过「 大O符号表示法 」,这段代码的时间复杂度为:O(n) ,为什么呢?我们先来看个例子:空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。(目前由于电子产品升级,我们不重视空间内存了,只考虑时间维度)一、时间复杂度时间复杂度:简单的来讲就是把编写的程序运行一遍所需要的时间,但是程序运行时间的长短与计算机的性能有关系,所以为了排除计算机性能对程序运行时间所需要时间的影响,我们引入一种表示方法:「 大O符号表示法 」,即 T(n) = O(f(n))
算法(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(n²)
平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。如果将其中一层循环的n改成m,即:
参考上面的O(n²) 去理解就好了,O(n³)相当于三层n循环,其它的类似。
本文参考资料:
《程序与算法》
《大话数据结构》
《算法的艺术》