前一段去面试,被问到了时间复杂度和空间复杂度,其实这是两个并不复杂的概念,但是从大学开始就没弄明白,就一直搁浅。。。面试过后大受刺激,决定弥补自己的这段漏洞。
- 干什么的
先来说说它们是用来干什么的,举个简单的例子,比如让你计算1+2+3+……..100,一个简单的程序,相信大部分人抬手就写出了如下代码。
A: For(i=1;i<101;i++)
{
sum=sum+i;
}
这段很简单没什么问题,但是计算这个问题还有另一种算法,相信大家还记得数列的求和公式(数学家高斯计算的时候就用的是这个方法),(1+n)n/2,相信大家还记得,首项加末项乘以项数除以2(这句好像有点多余。),如果使用了这个公式的话,算法就变成了。
B: Sum=(1+100)*100/2
相信大家已经发现了区别,上面的代码运行了100次(也就是N次),下面的代码无论n为几,都只运行了一次,那么这种区别如何描述呢,就引入了时间复杂度这个词。
- 代表什么意思
时间复杂度可以理解为计算机处理这段代码所需的时间(当然你要抛开硬件问题,不能用286和现在的电脑比运行时间。。),那如何来表示呢。A段代码我们要处理n个数,要运行n次,那么我们用一个函数f(n)来表示代码运行的次数,括号里面的n代表你要处理的数,A段代码中要运行n次,那么对于A来说f(n)=n,同样B段代码,只运行了一行代码,所以f(n)=1,所以我们用f(n)来表示代码运行的次数。
时间复杂度的表达式是 T(n)=O(f(n)),f(n)之前已经解释过了,那么O(f(n))就代表运行f(n)所需要的时间,那么对于A段代码的时间复杂度就表示为O(n),B段代码为O(1),那么比较A和B,随着n的增大,O(n)明显远大于O(1)。
- 空间复杂度
这个其实和时间复杂度差不多,空间复杂度的主要作用是用来空间来赢得时间,比如之前从1加到100,如果事先建好了一个数组,里面记录了1到100的值,比如sum[1]=1,sum[2]=3………….sum[100]=5050,那么这样再计算代码A的时候只需要一句代码去数组里面查找key对应的value就可以了,只需要一次查找所以时间复杂度是0(1),虽然赢得了时间,但是浪费了内存空间,所以空间复杂度为O(n),到底什么时候需要利用空间换取时间都要根据具体的情况来定。
有不对的地方还希望大家批评指正,互相交流学习。