第一部分:学习内容概要
- 程序开发过程
- 问题求解
- 算法和算法分析
- 数据结构
第二部分:学习笔记
- 程序开发过程
框架图
分析,严格化——设计——编码——检查,翻译——测试/调试
牛顿迭代法
0.对给定正实数x和允许误差e,令变量y取任意正实数值,如:y = x;
1.如果y*y与x足够接近,即 | y * y - x | < e,计算结束并把y作为结果;
2.取z =(y + x / y)/ 2;
3.将z作为y的新值,回到步骤1.
(举个栗子:完成平方根计算的Python函数)
def sqrt(x):
y = 1.0
while abs( y * y - x ) > 1e-6
y = ( y +x / y) / 2
return y
-
问题求解
交叉路口的红绿灯安排
贪婪算法(贪心法):根据当时掌握的信息,尽可能地向得到解的方向前进,知道不能急需再换一个方向。这样做通常找不到最优解,但能找到可以接受的解。
红绿灯问题求解过程:
1.有关工作开始于交叉路口的抽象图示,首先美剧出所有允许通行方向;
2.根据通行方向和有关不同方向冲突的定义,画出冲突图;
3.把通行方向的分组问题归结为冲突图中不相邻顶点的划分问题,用求出不相邻顶点的分组作为交叉路口中可以同时通行的方向的分组。(具体实现)
def coloring(G): color = 0 groups = set() verts = vertices(G) while verts: new_group = set() for v in list(verts): if not_adjacent_with_set(v, newgroup, G): new_group.add(v) verts.remove(v) groups.add((color, new_group)) color += 1 return groups
-
算法和算法分析
- 三个基本概念
问题:一个问题W是需要解决(需要用计算求解)的一个具体需求。(例如判断人一个正整数N是否为素数)
问题实例:问题W的一个实例w是该问题的一个具体例子,通常可以通过一组具体的参数设定。(例如判断1013是否为素数)
算法:解决问题W的一个算法A,是对一种计算过程的严格描述。对W的任何一个实例w,实施算法A描述的计算过程,就能得到w的解。(例如一个判断素数的算法应该能给出1013是否为素数的判断,也能满足其他正整数是否为素数的判断)
-
算法的性质
1.有穷性:一个算法的描述应该由有限多条指