第一章
时间复杂度:
指算法运行的速度。但由于机器硬件、软件以及问题规模等因素,同样的算法在不同机器、
不同规模下速度不一样。为统一分析算法的时间效率或者速度,用基本操作的执行次数来度量
算法的时间效率。这其中,又以执行频度最高的语句执行次数来衡量一个算法的随问题增长的
阶数。
空间复杂度:
是算法在运行过程中占用存储空间大小的度量。它包括三个方面:
1.存储算法本身所占用的存储空间
2.算法的输入/输出数据所占用的存储空间
3.算法在运行过程中临时占用的存储空间
常见的复杂度阶数:
排序法 平均时间 最差情形 稳定度 额外空间 备注
冒泡 O(n2 ) O(n2 ) 稳定 O(1) n较小时较好
交换 O(n2 ) O(n2 ) 不稳定 O(1) n较小时较好
选择 O(n2 ) O(n2 ) 不稳定 O(1) n较小时较好
插入 O(n2 ) O(n2 ) 稳定 O(1) 大部分已排序时较好
基数 O(logR B) O(logR B) 稳定 O(n) B是真数(0-9),R是基数(个十百)
Shell O(nlogn) O(ns )1<s<2 不稳定 O(1) s是所选分组
快速 O(nlogn) O(n2 ) 不稳定 O(nlogn) n较大时较好
归并 O(nlogn) O(nlogn) 稳定 O(1) n较大时较好
堆 O(nlogn) O(nlogn) 不稳定 O(1) n较大时较好
第二章 算法设计基本策略
蛮力法:
亦称穷举法、暴力法。枚举出所有可能状态,然后在这些状态中找到所需的解
贪心法:
该方法在每一步获得当前状态下最好的结果,通过使用局部最优解步步逼近的方式获得问题
全局的最优解。
贪心法并非完美的,因为有时问题的局部最优解无法逼近全局的最优解。
递归法:
直接或间接的调用自身的算法称为递归算法。
缺点:空间上的消耗大。
分治法:
将一个规模较大的问题划分为规模较小的问题,分别解决小问题。
三个基本步骤:
1.将原问题分解为若干相同的子问题
2.若子问题的规模容易解决则直接解决,否则继续分解。
3.将子问题的解合并得到原问题的解。
例子:汉诺塔问题
回溯法:
在包含问题所有解的空间树中,按照***深度优先***的策略,从根节点出发搜索整个空间树,
直到找到满足条件的所有解或解空间中已无活节点为止。
分支法:
在包含问题所有解的空间树中,按照***广度优先***的策略,依次搜索扩展结点的所有分支,
舍弃不满足约束条件的结点,并将其余节点加入活结表