算法重点总结。
一、引言——算法基本概念。
1. 什么是算法:有限指令序列,对某个问题能够得出正确答案的规则集合。
2. 算法的特点:确定性,可终止性,可行性,输入,输出。
3. 算法规模:问题实例的大小,输入的大小。
4. 基本运算:主要的、关键的、耗时的最小操作。
5. 算法正确性及复杂度证明方法:反证法、数学归纳法(p(a)成立,且对每个n>a,只要p(n-1)成立,p(n)一定成立)
6. 算法分析标准:正确性、工作量、占用空间量:算法运行过程中的内存占用情况、简单性和清晰性、最优性(即算法的上界(工作量的上界)等于求解问题的下界(问题固有的复杂度))
7. 算法选择方法:经验法和理论法(常用)
8. 算法的时间复杂度表示方法:大o表示上界,ω表示下界,θ表示同阶。
9. 选择排序:每次选择序列中最小值放在有序序列尾部(与无序数列头部元素交换)
10. 插入排序:将当前元素与前向有序数列比较,查找插入位置,移动后插入。
二、贪心算法。
1. 贪心算法的一般特性。
1) 优化问题:建立候选对象集。
2) 建立对象集合:划分解对象集和抛弃对象集。
3) 求解终止函数:判断解对象集是否是问题的解或者求解是否结束(未必是最优解)
4) 可行解函数:判断候选对象集元素是否可以加入到当前解的对象集中(未必是最优解)
5) 选择函数:指出哪个剩余的候选对象最有可能构成问题的解。
6) 目标函数:给出问题的解。
2. 贪心算法求解模版。
3. 找零问题的一般特性。
1)找最少硬币数,候选对象集
2)一选到的硬币集和未被选的硬币集。
3)判断解函数(solution),检查目前已选的硬币集中的金额是否等于要找的钱数。
4)如果集合中硬币钱数不超过应找金额,则该集合是可行的。
5)选择函数(selection),从未选硬币集合中找一个面值最大的硬币。
6)目标函数(object):计算硬币金额。
4. 图:最小生成树算法的一般特性。
1) 优化问题:建立候选图的边集。
2) 建立集合:已选中的边集mst,未选边集e-mst
3) 求解终止函数:如果mst构成生成树,则它是一个解。
4) 解存在函数:候选边加入mst构不成回路,则该边可以加入mst
5) 选择函数:prim算法选择u和v-u之间的最小边加入mst;kruskal算法从未选边中选最小边加入mst
6) 目标函数:计算mst中边权值和。
5. kruskal算法思想。
1)将所有边按权由小到大排列 ;
2)mst置空;
3)依次取最小边(u,v):
* 若(u,v)加入mst不构成回路则将(u,v)加入mst;
若mst中的边达到n-1条,则结束;
kruskal算法证明:归纳g的边数。
归纳基础:当g只有一条边,显然g就是最小生成树;
归纳假设:设t中有s6. prim算法思想。
1)解集合t为空,b为任意顶点。
2)从b和v-b之间的边中选一最小边(u,v), u属于b,v属于v-b
3)将(u,v)加入t,将v加入b
4)重复(2)-(3)n-1次。
prim算法证明:归纳于t中边的数目,如果t在任何步骤都是有希望的,则往t里加一条边后,仍然是有希望的。
7. 图:单源最短路径(非负边)dijkstra算法o(n2)
function dijkstra(l[1..n,1..n]) array[2..n]
array d[2..n]
c=for i=2 to n do d[i]=l[1,i]
for i=2 to n do
v=some element of c minimizing d[v]
c=c\ for each w∈c do
d[w]=min
return d
dijkstra算法证明:(数学归纳法)
a)如果一个顶点i满足i<>1,且i在s中,则d[i]给出了从源到i的最短路径长度。
b)一个顶点i不在s中,则d[i]给出了从源到i的最短特殊路径长度。(i的前驱在s中)
8. 贪心算法背包问题(可分割)
function knapsack(w[1..n],v[1..n]):array[1..n]
for i=1 to n do x[i]=0
weight=0;
while weight i=the best remaining object
if weight+w[i]<=w then x[i]=1
weight=weight+w[i]
else x[i]=(w-weight)/w[i]
weight=w
return x
如果根据v/w(价重比)降序顺序选择物品,则knapsack算法可以找到最优解。
9 贪心算法删数问题。
算法思想:利用数组(优化问题),输入数字序列组成待选集合,用初始输入数字序列作为解集合和初始抛弃集合为空(建立对象集合)。循环中,每次从解集合中去除一个数加入到抛弃集合中(可行解函数),使得解集合数列最大(选择函数),循环结束(求解终止函数)后所得解集合为所求最大值(目标函数)。
选择函数:从高位向低位,比较相邻两位数字大小,若高位比低位数字大,则将高位加入到抛弃集合中,若高位比低位小,则向低位移动继续比较。
10 贪心算法会场安排问题。
算法思想:利用数组(优化问题),记录活动开始时间和结束时间,按结束时间排序建立待选集合,初始解集合为空(建立对象集合)。循环中,从待选集合中选择结束时间较早的活动,令其与解集合最后一项活动比较两者是否相容(待选会议开始时间大于解集合中会议结束时间),若两者相容,则将待选会议加入到解集合中,若不相容,抛弃当前待选会议,从待选集合中选择下一项。
3、分治算法(递归分治算法)
1. 分治算法的一般三要素:
1)定义一个最小规模的问题,并给出其解。
2)把复杂的问题划分为同类型的若干规模较小的子问题,并分别解决子问题。
3)把各子问题的解组合起来,即可得到原问题的解。
2. 分治算法模版:
3. 二分递归查找算法:
4. 分治算法归并排序算法:
算法思想:比较两个有序数列首部,取较小值放入解集合,并删除其在原数列中的数据。若某一数列为空,则依次取非空数列元素加入解集合即可。
若两个数列无序,则将两个无序数列递归分割,最终得到两个只有一个元素的数列(即为有序),对其进行归并操作。
5. 分治算法快速排序算法:
算法思想:1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
6. 分治法求幂算法:
算法思想:1.最简单问题:n=0,解是1
2. 问题分解: an=an-1*a
3.解的合成:an=an-1*a
4、动态规划算法。
1. 动态算法基本思想:
用表记录已解决子问题的答案,需要时再找出已求得的答案,避免重复计算,即用空间换取时间,提高解题效率。
2. 动态规划设计方法:
1)基于递归算法设计动态规划算法:递归算法对分解的每个子问题都要递归求解,其中可能有许多子问题重复计算,导致效率低下。为避免这种重复,可以将递归算法改写为动态规划算法;
2)基于问题结构设计;
3. 动态规划的基本步骤:
1)找出最优解的性质,并刻画其结构特征。
2)递归地定义最优值。
3)以自底向上的方式计算出最优值。
基础写作整理笔记
基础写作。第一章新闻引论。第一节认识新闻报道写作。第二节新闻的界定。第三节如何选择新闻 第四节如何进行新闻策划 第五节如何采访新闻 第六节人物专访 第七节新闻的写作。第八节新闻的结构。第1节认识新闻报道写作。一 新闻报道的属性。1.第一层属性,它是事实信息传播而非观点传播的实用工具 2.第二层属性,...
基础班整理笔记
第五章会计要素的核算。一 资产的核算。一 设置的账户。1 库存现金 账户。性质 资产账户。用途 核算企业库存现金的增减变动情况。结构 借方 现金的增加数 贷方 现金的减少数 期末余额在借方,反映企业期末库存现金的实有金额。库存现金 账户的结构。2.银行存款 账户。性质 资产账户。用途 核算企业存入银...
大学基础写作课程笔记整理
一 写作学的性质 目的 特点和内容。1 写作学是一门具有术科性质的专业基础课。2 写作课的目的是培养学生具备扎实的基础写作功底,熟练掌握各种常用文体写作方法和技巧,能够写出具有一定水平的文章。3 写作的特点。1 综合性 写作是一门综合性的脑力劳动。内容上,它包罗万象,自然 社会 人生,工业 农业 军...