上一个
下一个

预备知识——时间与空间复杂度

我们是如何判断一个算法的好坏的?

——柒氿,(也许别人也说过)

想象这么一个简单的问题,有两个数我们对它们进行排序,很容易想到一眼盯真的方法是:把最大的放后面,最小的放前面。鉴定为:好方法。

但是对于更大的数据它适用吗?

想象3个数字时,我们似乎依旧可以用一眼盯真法:最大的放最后,最小的放最前,中间那个自然是符合条件的。我们这样描述我们自创的简单排序算法:扫描一次,把最大和最小的复制出来,放在数组两头,然后下次找比它们次小次大的,再扫描一次,放到数组内部的两头……直到最后得到一个排序好的。

我们注意到结束以后我们手上不仅有一个排序好的,那个混乱的数列我们也有。也就是说为了解决这个问题,我们不得不额外付出n(n是数据量)个空间,这是为了解决问题的代价。我们称之为空间复杂度:

空间复杂度

有空间复杂度自然也有时间复杂度,相信大家对它都有一定的了解,那么我们来算算刚刚那个方法的时间复杂度是多少吧。

对于n个数据,我们要扫描n/2次,要进行n次拷贝,那么很显然答案就是1.5n次。不得了,简简单单突破n的平方。

遗憾的是上面的计算方法是错误的,因为我们在实际中做不到一眼盯真,厉害点的20个数据也许都能做到瞧一眼看出最大,但就算把礼堂那位叫来也做不到200万个数据一眼瞧出来。

上述算法的时间复杂度很大很大,粗略估计一下:每次扫描,那个也许是最小的要与剩下所有都比较,(很显然这是“选择排序”的某种复杂的描述,不知道读者是否看出来了),差不多n(n-1),n会随着排序而缩小,但是最终均摊下拉,时间复杂度是n方。

需要指出的是,多次项我们只保留指数最大的那一项,所以1.5n就省略了。这里给出书上定义:

时间复杂度

我们使用空间复杂度与时间复杂度来描述一个算法的好坏——而在现实生活中,由于我们都是急急国王,而且内存往往足够大,所以我们更想要时间复杂度尽可能的低,哪怕为此付出一些空间作为代价。

订阅评论
提醒
0 评论
内联反馈
查看所有评论

《预备知识——时间与空间复杂度》

0
希望看到您的想法,请您发表评论x