1.1 编程的灵魂——数据结构+算法=程序
略过先
1.2 基本算法
1.2.1 枚举
【例题1】盒子里的气球
枚举算法 在很多时候,无法立刻得出某个问题的可行解或者最优解,但是可以用一种比较“笨”的方法通过列举所有情况然后逐一判断来得到结果,这就是枚举算法的思想。枚举算法的特点是比较单纯,往往容易写出程序,也容易证明算法的正确性和分析算法的时间复杂度,可以解决一些规模很小的问题。它的缺点是速度慢,当枚举量很大的时候运行速度无法忍受。
【例题2】图书馆
1.2.2 贪心法
【例题1】钓鱼
贪心法 每次选择一个局部最优策略进行实施,而不去考虑对今后的影响。一般来说,它的时间复杂度比较低,算法实现也比较容易。但很多题目贪心法并不能得到最优解。即使可以,也比较难证明解的最优性。需要注意的是,贪心法有一种推广,即无回溯的决策过程。有的题目看起来很难,但是如果证明当前决策至少不会比其他决策差,那么就可以一直决策下去。
【例题2】照亮的山顶
【例题3】镜子盒
专题一 —— 子集系统优化问题
略过先
1.2.3 递归与分治法
【例题1】折纸痕
递归法 递归法把问题转化为规模更小的子问题解决。递归法思路清晰,编程简单,但有时候难以想到。如果确定了用递归法解题,思考的重点应该放在建立原问题和子问题之间的联系。有的问题有很明显的递归结构,但是需要仔细思考,才能正确的转化为结构相同的子问题。
【例题2】三色多边形
【例题3】聪明的学生
小知识(3)—— 分形
略过先
【例题4】丢失的数
专题二 —— 解递归方程、主定理
略过先
1.2.4 递推
【例题1】月亮之眼
【例题2】Yanghee的数表
小知识——递推的几种用法
略过先
专题三——询问式交互问题
【例题3】原子链
1.3 数据结构(1)——入门
1.3.1 栈和队列
小知识——上下文无关文法下推自动机
3.种子填充法(floodfill)
1.3.2 串
1.3.3 树和二叉树
【例题1】蚂蚁和瓢虫
【例题2】隔三遍历
1.3.4 图及其基本算法
- 图的定义
- 图的实现
- 图的遍历
- 拓扑排序
1.3.5 排序与检索基本算法
- 二分检索
- 【例题1】电缆
- 基本排序算法
- 【例题2】煎饼
- 快速排序和归并排序
- 【例题3】士兵排队
- 【例题4】最小可靠交换
1.4 数据结构(2)——拓宽和应用举例
1.4.1 并查集
【例题1】代码等式
【例题2】团伙
【例题3】银河英雄传说
【例题4】可爱的猴子
【例题5】蜗牛
【例题6】基于 rank 的启发式合并和带路径压缩的并查集的均摊分析
1.4.2 堆及其变种
【例题1】积水
【例题2】赛车
【例题3】可怜的奶牛
【例题4】最轻巧的语言
专题七——两种特殊的堆:杨氏图表和笛卡尔树
1.4.3 字典的两种实现方式:哈希表、二叉搜索树
【例题1】马尔科夫链
【例题2】促销
【例题3】采矿
1.4.4 两个特殊树结构:线段树和Trie
【例题1】火星地图
【例题2】最长回文子串
1.5 动态规划
1.5.1 动态规划的两种动机
【例题1】括号序列
【例题2】棋盘分隔
【例题3】决斗
【例题4】“舞蹈家”怀特先生
【例题5】积木游戏
1.5.2 常见模型的分析
【例题1】方块消除
【例题2】公路巡逻
【例题3】并行期望值
【例题4】高性能计算机
【例题5】模板匹配
【例题6】不可分解的编码
【例题7】青蛙的烦恼
【例题8】排列问题
【例题9】最优排序二叉树
【例题10】Bugs公司
【例题11】迷宫统计
【例题12】贪吃的九头龙
1.5.3 若干经典问题和常见优化方法
【例题1】排列LCS问题
【例题2】序列分割