算法设计与分析读书笔记.docx
- 文档编号:449966
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:6
- 大小:23.44KB
算法设计与分析读书笔记.docx
《算法设计与分析读书笔记.docx》由会员分享,可在线阅读,更多相关《算法设计与分析读书笔记.docx(6页珍藏版)》请在冰豆网上搜索。
算法设计与分析读书笔记
竭诚为您提供优质文档/双击可除
算法设计与分析读书笔记
篇一:
算法设计与分析读书笔记
>-------一种创造性方法
---读书笔记【美】udimander
计算1314
苏帅豪
20XX21121109
chapter1:
(引论)
广义地说,算法是按部就班解决一个问题或完成某个目标的过程。
数学归纳法其原理的主要思想是命题无须从什么都没有开始证明,可以通过先证明对于一个小的基本实例集命题是正确的,然后由?
若对相对较小的命题实例成立则可导出较大的命题实例成立?
的方式,来证明对所有实例来说命题都是成立的。
因此它的基本思想是如何扩充一个解决方案而不是从零开始进行构造。
chapter2:
(数学归纳法)显而易见与真知灼见水火不容。
——伯特兰·罗素每次用归纳法证明都分成两步:
归纳基础和规约。
归纳基础一般都比较容易,偶尔也有不太简单的,但我们往往不太在意。
归纳法证明的核心就是规约,有多种规约方法,其中最常用的就是把命题从n规约到n—1,从n+1规约到n也比较常见。
强归纳法会把命题从n规约到比n小(但不一定是n-1)的一个或多个命题。
其它变形还有从2n规约到n,以及逆向归纳法,也就是命题在n时的情况是由n+1的情况推出的,而归纳基础是个已被证明的无限集。
规约的要点在于要完整保留原命题,不能在规约后的命题中加入多余的假设,除非这些假设是特别包含在归纳假设中的。
增量:
很明显,增量就是和我们平时的数学归纳法一样,特殊点的就是
证明起始条件;假设对于K,证明成立;用假设去证明对K+1,证明成立证明的重点就这如何利用‘K’证明‘(K+1)’
当然也可以认为是利用某种性质去推广
其实这个就是动态规划和贪心的基本性质,最优子结构性质以及重叠子问题性质(贪心选择性质)中的最优子结构性质;
现在举个"不同"例子找多数元素(多数元素的定义:
在给定有限个序列内,某元素的个数大于序列个数的1/2(比如{12333}中的3))
首先我们第一会想到枚举,很简单,时间复杂度为o(n^2);最好的情况是一遍遍历就找到了:
o(n)最坏的情况是序列中没有多数元素:
o(n^2)平均情况:
o(n^2)
现在让我们想下对于多数元素有什么性质,设序列元素个数为n,多数元素个数为m,
接下来给出一个很直接的性质(虽说很直接但是对我来说是不容易自己想出来的):
性质1:
删除序列中的两个不同的数,若存在多数元素,多数元素依然存在且不变。
现在我可以想出一个算法:
集合A:
序列
循环:
i:
1->n-1
if(A[i]==A[i+1]||A[i]不存在)continue;
elsedeleteA[i],A[i+1];
得到集合A`
很明显,集合A·中的元素一定相同
但是有个问题:
集合中的元素不一定就是多数元素。
原因是性质1的前提是多数元素对于序列存在,我们可能会得到一个非法解
我们该怎么办,很简单,验证下最后得到的那个元素就行,
时间复杂度:
o(n);
现在回过头看看我们的思路:
找到多数元素的性质,依次"增量"递减得到可能解,验证;
很明显找到性质是最关键的一步;
第二个例子,贪心;
双机调度问题:
问题描述
给定n个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i在机器j上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个
作业的处理顺序使得尽快完成这n个作业。
分析下:
若只有一个作业(a,,b1),明显时间为a1+b1;
若有两个作业(a1,b1),(a2,b2);
若(a1,b1)在前,则有时间T12=a1+b1+a2+b2-min(a2,b1);
若(a2,b2)在前,则有时间T21=a2+b2+a1+b1-min(b2,a1);
有上可得时间为Tmin=a1+b1+a2+b2-max{min(a2,b1),min(a1,b2)};
由此我们可以得到一个贪心的性质,(a1,b1)和(a2,b2)中的元素若min(a2,b1)>=min(a1,b2)则(a1,b1)放在(a2,b2)前面;反之(a2,b2)放在(a1,b1)前面;
根据这个性质我们对作业进行排序即得到最优工作序列;
ps:
由于个人表述能力不行,所以这个例子还有一些思考量,所以请大家自己用笔在纸上写下就可以得到一样的结论。
例外这个问题有个很优美的算法Johnson算法,基本原理与上面类似,但是把结论做得更漂亮些了,有兴趣的可以去看下证明过程;
这里给出Johnson算法:
对给定的任务进行如下排序:
得到序列A:
s1[i]>=s1[j]且以s1不减排序
序列b:
s1[i] 最优调度即为A+b;
现在再回到数学归纳法上,回想如果我们得到K结论不足以证明?
K+1?
该怎么办?
!
一个很常用的思想就是加强结论;
例三:
最大连续子序列和问题
问题描述:
给出序列A,求连续子序列和最大,我们定空序列为0;
下面直接给数学归纳法的(思考)过程:
设序列中元素个数为n
若序列中元素个数n为1,则最大子序列和为:
A[1]>0?
A[1]:
0;
假设对于子序列"K"(前k个元素的子序列),得到最大子序列s=?
A[i]...A[j]?
(1=s?
s+A[k+1]:
s;
若s中的j!
=k+1,....
这个,我们该怎么办呢,关于最大子序列s与A[k+1]我们找不到更多的联系;
那么我们加强下论证结果,加入一个最大尾子序列和(包括当前序列尾节点的最大子序列):
s.end=?
A[m]...A[k]?
(1 明显若s.end 现在我们重新证明下;
设序列中元素个数为n
若序列中元素个数n为1,则最大子序列和为:
A[1]>0?
A[1]:
0;最大尾子序列和为:
0+A[1]>0?
0+A[1]:
0;
假设对于子序列"K"(前k个元素的子序列),得到最大子序列s=?
A[i]...A[j]?
(1 那么对于子序列"K+1",最大子序列和为s>s.end+A[k]?
s:
s.end+A[k];
最大尾子序列和为s.end+A[k]>=0?
s.end+A[k]:
0;
这样就可以得到我们熟悉的时间复杂度为o(n)的最大子序列和算法了。
首先给出时间复杂度的主方法;
给出这个的目的是一种指引,对于设计算法的指引,通过这个你可以看到怎么样设计一个算法它的时间复杂度更低;
例子四,最近点对问题
问题描述:
给出二维平面内若干个点的坐标,求出欧式距离最小的点对;
这个问题的算法有种分治版本并且网上的证明很多,我只是想给出它的简单思想;首先对所有点进行排序,按照x递增的顺序排序;
1,二分排序后的点;两边的点数目大致相等(这只是奇偶数问题)
2,对两边点进行递归求解子最小点对距离len1,len2,直至点的数目 对于合并,如果我们枚举的话,根据上面的主方法得到时间复杂度为o(n^2),这样还增加了问题的复杂性;
我们可以看到只有在划分线周围的点才可能比两边找到的子最近点对距离,
所以我们找到划分线两边距离d为min{len1,len2}的所有点;
若此时仍然枚举,时间复杂度还是为o(n^2);
接下来我就直接给出问题的正解,因为网上这类资料博客还是比较多的。
对于上一步得到的点,按照y不减排序,得到新的点序列,枚举每个点和每个点后6个的最小距离,更新最点点对距离;
根据主方法我们得到时间复杂度为o(nlogn)
chapter3:
(算法分析)仅仅望着树上的果实,而不去测量树的高度,是个愚人。
——鲁夫斯1.时间复杂度
(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。
但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。
并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
一个算法中的语句执行次数称为语句频度或时间频度。
记为T(n)。
(2)时间复杂度在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。
但有时我们想知道它变化时呈现什么规律。
为此,我们引入时间复杂度概念。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。
记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
时间频度不同,但时间复杂度可能相同。
如:
T(n)=n+3n+4与T(n)=4n+2n+1它们的频度不同,但时间复杂度相同,都为o(n)。
按数量级递增排列,常见的时间复杂度有:
常数阶o
(1),对数阶o(log2n),线性阶o(n),线性对数阶o(nlog2n),平方阶o(n),立方阶o(n),...,k次方阶o(n),指数阶o
(2)。
随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
(3)最坏时间复杂度和平均时间复杂度最坏情况下的时间复杂度称最坏时间复杂度。
一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。
这样做的原因是:
最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
n23k222
篇二:
算法设计与分析学习心得
算法设计与分析学习心得
班级:
物联网1201姓名:
刘潇学号:
1030612129
一、实验内容:
这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数组,对话框下拉列表,排序问题。
二、学习掌握:
基本程序描述:
(1)货郎担问题:
货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它。
货郎担问题要从图g的所有周游路线中求取具有最小成本的周游路线,而由始点出发的周游路线一共有(n一1)!
条,即等于除始结点外的n一1个结点的排列数,因此货郎担问题是一个排列问题。
货郎担的程序实现了利用穷举法解决货郎担问题,可以在城市个数和各地费用给定的情况下利用穷举法逐一计算出每一条路线的费用,并从中选出费用最小的路线。
从而求出问题的解
(2)费用矩阵:
费用矩阵的主要内容是动态生成二维数组。
首先由键盘输入自然数,费用矩阵的元素由随机数产生,并取整,把生成的矩阵存放在二维数组中,最后把矩阵内容输出到文件和屏幕上。
它采用分支界限法,分支限界法的基本思想是对包含具有约束条件的最优化问题的所有可行解的解(数目有限)空间进行搜索。
该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集,并为每个子集内的解计算一个下界或上界。
动态生成二维n*n的数组程序利用指针表示数组的行和列,并逐一分配空间,在输入n的数值后,系统自动分配空间,生成n*n的数组,并产生随机数填充数组,最后将结果输入到指定文件中。
(3)mfc:
在下拉列表框中添加内容程序,在下拉列表对应的函数中利用addstring添加需要的内容。
首先定义下拉列表框为ccombox型,并定义其属性名,利用addstring函数可以任意添加需要的内容。
a排序问题:
快速排序的运行时间与划分是否对称有关,其最坏情况发生在划分过程中产生的两个区域分别包含n-1个元素和1个元素的时候。
其算法的时间复杂度为o(n2),在最好的情况下每次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 读书笔记