注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性。
本文阅读时间约为4分钟。
什么是算法分析
Python的强制缩进是好的,因为保证了语句块功能和视觉效果的统一。不强制缩进有时会造成灾难性后果,一个反面案例就是苹果公司的一个低级BUG,由于C语言源代码书写缩进对齐的疏忽,造成了SSL连接验证被跳过。
计算资源指标
什么是计算资源?一种是算法解决问题过程中需要的存储空间或内存。另一种是算法的执行时间。
大O表示法
从理论计算机科学中借鉴而来,我们称之为大O符号。它来自希腊字母Omicron,Donald Knuth在测量这些东西时使用了它。我们将大O看作函数渐进式增长的上限。
赋值语句同时包含了(表达式)计算和(变量)存储两个基本资源。
问题规模:影响算法执行时间的主要因素。
算法运行时间分为最好、最差、平均情况,其中平均情况体现了算法的主流性能。
运算量的大小基本上取决于迭代的次数,最坏的情况。至于乘法系数和附加的常数,在迭代数量n足够大的情况下,影响足够小。所以,最重要的影响时间复杂度的因子是迭代的次数n。
其它算法复杂度表示法
大O表示法——表示了所有上限中最小的那个上限。
大Ω表示法——表示了所有下限中最大的那个下限。f(n)=Ω(g(n))当且仅当g(n)=o(f(n))。
大θ表示法——如果上下限相同,那么就可以用大θ表示。f(n)=θ(g(n))当且仅当f(n)=O(g(n))且f(n)=Ω(g(n))。
本课程主要研究大O表示法。
时间复杂度按低到高排列如下:
- O(1)——constant running time常数。
- O(logn)——logarithmic running time对数。例如,二分搜索法。
- O(n)——linear running time线性。例如递归,阶乘的例子。
- O(nlogn)——log-linear running time, 对数线性。
- O(n^c)——polynomial running time多项式幂。通常发生在嵌套循环当中。
- O(c^n)——exponential running time指数。
复杂度越高,需要的运行时间就越长。我们需要尽可能短的时间,所以上述列表越往上越好。
To be continued.