算法基础笔记整理

发布 2021-05-12 18:49:28 阅读 1416

算法重点总结。

一、引言——算法基本概念。

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 综合性 写作是一门综合性的脑力劳动。内容上,它包罗万象,自然 社会 人生,工业 农业 军...