我们用O(T(n))来表示复杂度,读bigO,T(n)为输入的规模,只看T(n)的高级项,忽略低级项和常数项,这种方法叫渐进分析。(注意:这是最坏情况下的分析)
我们统一算法和机器性能
基本操作,如运算、赋值、比较等,基本操作的代价为1.
一个顺序结构的代码,时间复杂度是 O(1)。
二分查找,或者更通用地说是采用分而治之的二分策略,时间复杂度都是 O(logn)。
一个简单的 for 循环,时间复杂度是 O(n)。
两个顺序执行的 for 循环,时间复杂度是 O(n)+O(n)=O(2n),其实也是 O(n)。
两个嵌套的 for 循环,时间复杂度是 O(n²)。

程序优化的最核心的思路
第一步,暴力解法。在没有任何时间、空间约束下,完成代码任务的开发。
第二步,无效操作处理。将代码中的无效计算、无效存储剔除,降低时间或空间复杂度。
第三步,时空转换。设计合理数据结构,完成时间复杂度向空间复杂度的转移。

统一后,算法的运行时间依赖于问题的输入规模与实例。
算法的分析:时间复杂度和空间复杂度该如何进行分析
相同输入规模,实例影响性能:下面是插入排序的伪代码,在内循环中,我们不知道比较的次数,此时考虑最好情况和最坏情况
算法的分析:时间复杂度和空间复杂度该如何进行分析
插入排序的输入,正序或者逆序,比较的次数不同
算法的分析:时间复杂度和空间复杂度该如何进行分析
但是我们通常情况下考虑的是最坏情况下的复杂度:
算法的分析:时间复杂度和空间复杂度该如何进行分析
也即是,在最坏情况下分析,算法的运行时间,也就是时间复杂度只与输入的规模有关系:
算法的分析:时间复杂度和空间复杂度该如何进行分析
渐进分析用O()表示法。
算法的分析:时间复杂度和空间复杂度该如何进行分析

相关文章: