经过考虑,还是准备写这样一个系列的文章了,初衷是帮助各位更好地理解部分算法。笔者之前阅读了《算法导论》(机械工业出版社)的部分章节,感受是内容非常全面,但是有些语言过于书面或者数学化,对于阅读理解不太好的同学(比如说我)或数学一般般的同学(还比如说我)不是十分友好。我们学习算法更多地是为了应用,需要明白怎么做。当时学习的时候,也参考了许多大大写的文章,有些讲解通俗,令人茅塞顿开。在这个系列中,我将以尽可能通俗清晰的语言,告诉大家某些算法是如何进行的。
作为开篇,先讲解一下算法的最基本问题——时间复杂度吧。
时间复杂度
算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。时间复杂度给出了算法的运行时间与问题的规模n的关系,这个n在不同问题中有不同的体现,例如输入的数据个数、正方形边长等,由于计算机性能的不同,无法得到完全精确的时间与问题规模的函数关系。因此时间复杂度讨论的是问题的求解时间的量级,也就是求解时间随规模增长的速度。
例如,时间复杂度
代表问题求解时间随规模增加呈线性增长
代表问题求解时间随规模增加呈平方级增长
渐进记号
为了表达时间复杂度函数的某些重要的性质,常常使用一些渐进记号,这些记号通常表示函数的上界、下界或紧确界。这部分对应了微积分或实分析的函数极限概念。
O记号
大O记号表示渐进上界。对于给定的函数g(n),O(g(n))代表一个函数族,定义为:
注: