《算法艺术与信息学竞赛》第1章 算法与数据结构 学习笔记

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. 图的定义
  2. 图的实现
  3. 图的遍历
  4. 拓扑排序

1.3.5 排序与检索基本算法

  1. 二分检索
    • 【例题1】电缆
  2. 基本排序算法
    • 【例题2】煎饼
  3. 快速排序和归并排序
    • 【例题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】序列分割

1.6 状态空间搜索

1.6.1 状态空间

1.6.2 盲目搜索算法

1.6.3 启发式搜索算法

1.6.4 博弈问题算法

1.6.5 剪枝

*1.6.6 专题:路径寻找问题

*1.6.7 约束满足问题

猜你喜欢

转载自www.cnblogs.com/quanjun/p/13179594.html