程序员写的代码,代码的质量除了阅读性要好,可扩展性外,更重要的是耗时要尽量少,占用的内存尽量少。在代码里,耗时多少则用时间复杂度表示,占用的内存多少则可以用空间复杂度表示。
(1)什么是时间复杂度?
例如:小明和小花同时阅读一篇n页的书,小明每天读1页,小花每天读一半(以页为单位,剩余1页时直接读完),那么他们多少天可以读完?
可以看出,小明需要n天,小花需要天。
那么小明的时间复杂度就是:O(n),小花的时间复杂度就是。
(2)程序的时间复杂度
简单的来说,一个循环的时间复杂度为n,双重循环时间复杂度为n的二次方,三重循环就是n的三次方,以此类推。
(3)什么是空间复杂度?
例子:已知一亩地一年可以收获水稻1千斤,那么要收获n千斤水稻需要多少时间,多少地?
下面是小明和小花的做法:
第一种:小明一次性种了n亩水稻,那么一年则可以达到目标,但这个方式需要耗费了大量的土地。
第二种:小花一年种1亩水稻,那么n年则可以达到目标,这个方式虽然节约了不少土地,但却需要耗费大量的时间。
不难看出,不管多少目标产量,
小明的时间始终为1年,则时间复杂度记为O(1);小花的时间则需要n年,时间复杂度记为O(n)。
程序的数据都是存在内存上的,空间复杂度好比这里的土地,都是一个单位一个单位的,只从耗内存方面来说,肯定是花的越少越好。
所以,从空间复杂度来说,小明的方式则需要n亩地,记为O(n);小花的方式则始终为1亩地,则记为O(1);
(4)程序的空间复杂度
两复杂度表示方法
时间复杂度和空间复杂度都用O(f(n))表示,这里f(n)为n的表达式,如何具体区分呢?
由于时间的单词是Time,空间的单词是Space。于是通常用T(n)表示时间复杂度,S(n)表示空间复杂度。
那么上面水稻的问题,小明和小花的时间复杂度和空间复杂度就可以具体的描述出来了。
小明:T(n) = 1,S(n) = n;
小花:T(n) = n,S(n) = 1;
两复杂度关系
在书写一段代码的时候,时间复杂度和空间复杂度往往是呈反相关的。即时间尽可能的少的时候,往往牺牲的内存比较大,即程序员口中常说的 “拿内存换性能” 之说。
一段代码逻辑是否有真的存在最优解?即耗时少,消耗内存较低的写法。
答案是肯定的,《数据结构与算法》就是研究的这个,只要算法学习好了,代码的质量就会获得提高。