算法设计与分析答案屈婉玲.docx
《算法设计与分析答案屈婉玲.docx》由会员分享,可在线阅读,更多相关《算法设计与分析答案屈婉玲.docx(15页珍藏版)》请在冰豆网上搜索。
算法设计与分析答案屈婉玲
算法设计与分析答案屈婉玲
【篇一:
分金块问题的解决思想和算法设计】
s=txt>摘要:
在日常生活中,分金块问题是一个常见的问题,人们总是会面临怎样比较大小。
才能利用一种最高效的算法选出其中最大和最小的金块。
本文给出了较为常用的两种算法—蛮力法和分治法。
关键词:
分金块问题;蛮力法(非递归);分治法;
pointsgoldbullionproblemsolvingthoughtandalgorithmdesign
abstract:
indailylife,pointsgoldbullionisacommonproblem,peoplewillalwaysfacehowtocomparesize.canuseoneofthemostefficientalgorithmchoosethemaximumandminimumofthegold.thispapergivesamorecommonlyusedtwokindsofalgorithm,bruteforcemethodandpartitionmethod.
keywords:
pointsgoldbullionproblem;bruteforcemethod(nonrecursive);partitionmethod;
1引言
递归调用是一种特殊的嵌套调用,是某个函数调用自己,而不是另外一个函数。
递归调用一种解决方案,一种是逻辑思想,将一个大工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了……,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。
由于回溯法是对解空间的深度优先搜索,因此在一般情况下可用递归函数来实现回溯法
2问题概述
老板有n个金块,希望最优秀的雇员得到其中最重要的一块,最差的雇员得到其中最轻的一块。
假设有一台比较重量的仪器,如何用最少的比较次数找出最重和最轻的金块?
理解金块问题:
以9以内的实例理解问题。
金块示例
问题:
1.最重的是那块?
用max标记。
2.最轻的是那块?
用min标记。
3求解分金块问题的常用算法
3.1蛮力法
蛮力法,也称穷举法,是一种简单而直接地解决问题的方法,常常直接基于问题的描述,因此,也是最容易应用的方法。
但是,用蛮力法设计的算法其时间性能往往是最低的,典型的指数时间算法一般都是通过蛮力搜索而得到的。
即从第一块开始查找,查找哪块最重,哪块最轻。
算法设计:
maxmin(floata[],intn)
{max=a[1];min=a[1];
for(i=2;i=n;i=i+1)
{if(maxa[i])
max=a[i]
elseif(mina[i])
min=a[i]
}
return(max,min)
}
step1将所有金块重量存于数组
step2将第一个金块同时标记为最重和最轻的金块
step3将第一个与后一个进行重量的比较,将更重的标记为max,同时如果现阶段最轻的比后者轻,那么
将后者标记为min。
step4依次进行比较,最重得到最重的和最轻的maxmin.
3.2分治法
1典型二分法思想:
一种简单的分治法。
即当每次将比较大的一个问题一分为二,形成两个较小的问题,再把每个较小问题一分为二,变为更小的两个问题,……,直到得到容易解决的小问题为止,再解决所有小问题,然后把小问题的解逐层合并,得到原来大问题的解。
2用二分法如何解决金块问题?
从两个简单实例谈起:
(1)假设只有一个金块,重10克,则不需要比较轻重,最重者和最轻者是同一个金块。
即比较0次。
(2)假设有2个金块,一个重10克,另一个重16克,则
需要比较1次,可以把最重者和最轻者确定下来。
(3)当有多个金块时(假设6块),则用二分法对其分
解,直到分解为
(1)或
(2)的情形时,问题很容易解决。
假设6个金块重量如下(以找最轻金块为例):
264381
一分为二(两组):
【264】【381】
一分为二(四组):
【26】【4】【38】【1】
解较小子问题:
2431
合并子问题解:
21
最终的解:
1
3用二分法解决金块问题算法设计:
问题抽象、简化为:
在n个元素的集合中寻找最大和最小值元素。
(1)将集合一分为二,变为两个集合,目的是在较小的两个集合中分别找最大、最小元素。
(2)递归分解较小集合,直到每个集合中的元素个数≤2,然后找出小集合的最大、最小元素。
(3)合并(回溯):
自低向上把子问题的解合并,大元素中取最大者,小元素中取最小者,最后得到元问题的解。
4用二分法解决金块问题算法描述:
voidmaxmin(inti,intj,floatfmax,floatfmin)
{
intmid;
floatlmax,lmin,rmax,rmin;
if(i==j)
{
fmax=a[i];
fmin=a[i];
}
elseif(i==j-1)
if(a[i]a[j])
{
fmax=a[j];
fmin=a[i];
}
else
{
fmax=a[i];
fmin=a[j];
}
else
{
mid=(i+j)/2;
maxmin(i,mid,lmax,lmin);
maxmin(mid+1,j,rmax,rmin);
if(lmaxrmax)
fmax=lmax;
else
fmax=rmax;
if(lminrmin)
fmin=rmin;
else
fmin=lmin;
}
}
4仿真实验及其结果:
在eclipse3.5环境下测试bruteforcemethod,随机输入n=8;num={23,43,3,5,6,23,9,6}验证,
验证结果max=43;min=3结果正确。
输入n=6;num={3,7,8,9,0,15}验证;
验证结果max=15;min=0结果正确。
表-1bruteforcemethod实验输入输出参数设置
由于蛮力算法是从第一个金块开始逐一寻找,直到和第n个金块比较之后才结束,所以最后得到的必然是最重(max)、最轻(min)的金块.
表-2partitionmethod实验输入输出参数设置
表-2贪心算法的时间复杂度分析
分析蛮力法可以看出,比较操作maxa[i]和mixa[i]是执行频次最高的关键语句。
因此以这两个语句执行的总次数作为该算法执行所需要的时间。
最好情况下,金块由轻到重排列,不需要进行mina[i]比较,而maxa[i]比较共需进行n-1次,即可得到max和min;最坏情况下,金块由重到轻排列,还需要进行n-1次mina[i]比较,才能得到最终的min,因此共进行2(n-1)次比较。
在平均情况下(概率平均),a[i]将有一半的时间比max大,因此平均比较次数是3(n-1)/2。
所以算法时间复杂度为o(n).
分析分治法可以看出,元素比较总次数作为maxmin算法的时间复杂度度量指标,用t(n)表示比较总次数,则可以推导出递归关系:
t(n)下界为(3n/2)-2
5结束语
本文给出了两种关于金块问题的算法,分别是蛮力法和二分法。
分析了其时间复杂度和占用空间等。
总结了两种算法的特点及适用性。
一般情况下,选择二分法较为快速,但内存消耗较大。
参考文献
[1]《算法设计与分析》王红梅清华大学出版社(2006-07出版)
[2]《算法设计与分析》屈婉玲、刘田、张立昂清华大学出版社(2011-05出版)
[3]《java核心技术(卷1):
基础知识(原书第8版)》昊斯特曼(horstmanngays.)、garycornell、叶乃
文、邝劲筠机械工业出版社(2008-06出版)
【篇二:
b0301340s-算法分析与设计-课程实验教学大纲】
s=txt>课程编号:
课内总学时:
b0301340s48
课程名称:
实验学时:
算法分析与设计8
实验类别:
□通识基础□学科基础■专业基础□专业
一、实验课程的性质、目的和任务
性质:
本实验课程是软件工程专业的专业基础课,该实验是理论课程的课内上机实验环节。
目的:
加深学生对算法设计的基本策略和主要方法的理解,培养学生针对具体的问题,选择合适的数据结构和设计结构清晰、正确有效的算法的能力。
任务:
通过8个课时的实验,学生需要完成分治策略、动态规划法、回溯法和密码算法四个实验内容,掌握为实际问题设计合适的算法、以及结合程序设计语言加以具体实现的技能,锻炼学生运用书本知识实际解决问题的能力,达到对所学算法思想理解深刻、举一反三的目的。
每位同学应在实验课前充分复习和理解课堂教学内容,明确实验目的和任务,对实验题目进行分析,掌握实验原理及过程,选择有效的算法编程实现,并进行充分测试。
在实验中通过独立思考、与同学讨论、老师辅导答疑相结合的方法完成相应的实验内容。
二、实验内容、学时分配及基本要求
三、考核及实验报告
(一)考核
本课程实验的考核包括:
有无缺勤、有无事先准备程序代码、实验课上是否认真做实验、程序代码和实验结果是否正确、实验报告的撰写情况等几个方面。
实验课成绩由平时实验课的课堂表现、源代码及实验报告内容综合评定。
实验课成绩记入该课程的平时成绩,约占课程总成绩的15%。
(二)实验报告实验报告的内容:
实验名称、实验目的、实验任务、实验内容(包括系统分析、概要设计和详细设计)、实验过程描述(包括核心算法和算法分析、程序代码、测试用例、实验结果分析)、实验小结(包括实验过程中遇到的问题及体会)。
实验报告的要求:
实验报告以文本形式递交。
实验报告要求书写规范、内容完整、文字通顺、图表清晰。
四、主要仪器设备
硬件:
微型计算机。
软件:
windows操作系统,visualc++6.0。
五、教材及参考书
教材
[1]陈慧南.算法设计与分析—c++语言描述(第二版).北京:
电子工业出版社,2012参考书
[1]王晓东.计算机算法分析与设计.北京:
电子工业出版社,2001年.
[2]thomash.cormen,charlese.leiserson,ronaldl.rivest,cliffordstein著.算法导论.潘金贵,顾铁成,李成法,叶懋译.北京:
机械工业出版社,2007年.
[3]robertsedgewick,kevinwayne著.算法(第4版).谢路云译.北京:
人民邮电出版社,2013年.
[4]jonkleinberg,evatardos著.算法设计.张立昂,屈婉玲译.北京:
清华大学出版社,2007年.
[5]sarabaase,allenvangelder著.computeralgorithms,introductiontodesignandanalysis.北京:
highereducationpress,2001年.
执笔人:
张怡婷审核人:
陈志实验院长:
陈丹伟
编写完成时间:
2014.1.6
附件:
设计性实验教学大纲一、实验目的
通过构造一个简单的rsa公开密钥系统,使学生熟悉非对称密钥系统的工作流程,理解加、解密算法的基本原理,能够编程实现生成正确的公有/私有密钥对、用公有密钥对明文进行加密并用私有密钥对密文进行解密的功能,并了解该rsa算法在实际系统中的应用。
在该配套实验环节中,达到进一步巩固和加强学生对《算法分析与设计》课程相关知识点的掌握和理解的目的。
二、设计内容
1.根据题意和加、解密基本原理,设计具体的算法流程。
2.完成rsa密钥系统的具体实现,使之能够生成正确的公有密钥和私有密钥,并能用公有密钥对明文进行加密、用私有密钥对密文进行解密。
3.在生成公开/私有密钥对的过程中,培养学生借助已有的成熟算法并加以变换来解决实际应用中新问题的能力。
4.进一步锻炼学生编程的方法和技巧,提高学生编制清晰、合理、可读性好的应用程序来实现算法的能力。
三、实验要求
要求了解密码学中加/解密的基本原理,掌握数论的基本知识,理解非对称密码体制的著名代表rsa加密算法的工作原理和流程,能够设计并实现一个简单的rsa公开密钥加解密系统。
四、实验报告
该课程的实验是理论课程学习的重要实践环节,实验报告应包括以下几个部分的主要内容:
一、实验目的和要求二、实验环境
硬件:
微型计算机和打印机。
软件:
windows2000以上操作系统;visualc++6.0编程环境。
三、实验原理及内容主要包括:
1、对本次实验的题目更为深入的理解、对实验原理和步骤的清晰阐述等。
2、对实验内容、实验过程以及源程序代码的详细记录。
(应包括全部实验内容的源代码、测试数据及运行结果、实验相关结论。
对代码中关键行要注释。
)
四、实验小结
主要包括:
在编程、调试、测试过程中遇到的问题及解决方法、本次实验的心得体会、进一步改进的设想等。
五、思考题
1.由于实际应用中rsa算法通常需要选择大质数进行运算,因此实际系统中如何实现大数运算的功能,对超出整型变量表示范围的数进行运算?
2.如何自行实现随机生成质数的功能?
如何快速判断一个数是否质数?
3.rsa加密的安全性是如何保证的?
4.rsa加密算法的优缺点都有哪些?
5.针对rsa算法可能有哪些攻击方法?
6.如何将rsa算法用于数字签名?
执笔人:
张怡婷审核人:
陈志
编写完成时间:
2014年2月2日
实验院长:
章韵
【篇三:
浙教版高一《算法与程序设计》】
/p>课时)
一、设计思想
本课以《浙江省普通高中新课程实验信息技术学科教学指导意见》为指导,在高中一年级下学期《算法与程序设计》选修课阶段开展教学。
本课以培养学生能力为目标,突出学生观察、实践、应用能力,领悟生活中的相关应用。
二、教材分析1.《高中信息技术课程标准》提出信息技术课的基本理念之一是强调问题的解决,倡导运用信息技术进行创新实践。
在课程设置上,《算法与程序设计》可在高一下学期选修,其中“对分查找”算法是学生技能提升的重要一课;
在《信息技术学科教学指导意见》中“对分查找”算法要求学生了解对分查找的概念、初步掌握该算法,重点是对算法分析,以讲授法为主,适当让学生讨论与体验。
2.对分查找算法由理解该算法概念、流程图分析、算法描述、程序实现组成,在“查找”模块中是重点要求部分;
3.初中阶段未学习过相关知识,故这部分作为全新内容学习。
三、学情分析
1.通过《信息技术基础》必修课《信息的加工》——《算法与编程》、《算法与程序设计》选修课的初步学习,学生已经对算法有一定了解,能够应用流程图和伪码对一些简单算法进行分析,能够初步应用vb编写简单应用程序、实现算法。
2.根据《信息技术学科教学指导意见》,《算法与程序设计》可按以下顺序教学:
先上“算法和算法表示”,再上“面向对象程序设计的基本知识”,接下来进行“算法实例的程序实现”、“算法实例”、“vb程序设计初步”穿插学习。
学生在此可能会遇到来自于对分查找法的分析、查找效率以及程序实现的困难;
3.学生学习此部分,会自然而然地把“对分查找”和“顺序查找”联系起来,因为顺序查找易于实现,相比之下,对分法稍稍有些困难;也有学生可能会采取先掌握流程再用自然语言实现、进而用程序实现的方法。
对此,在教学上可通过流程图的演示帮助学生理解对分查找比顺序查找高效。
四、教学目标
知识性目标:
1.了解并熟悉对分查找算法的概念、能列举现实生活中的应用实例;
2.能解释对分查找中数字之间的逻辑联系,明确对分查找算法相对于顺序查找法的优
势;
3.具备知识迁移能力,发现对分查找算法的现实应用,总结对分查找的规律,能把学习
所得应用于现实生活中。
技能性目标:
1.能通过流程图,剖析对分查找算法的原理;
2.能使用自然语言表达对分查找算法,并能应用信息技术与他人交流自己对此部分知识
的理解;
3.能熟练“对分查找算法”的程序实现,有效利用此算法解决实际问题。
情感、态度、价值观目标:
要求学生从“了解-理解-实现-应用”对分查找算法的过程,获得对该算法的感性认识,表达对分查找算法的学习体验,养成追求算法高效率、增加程序效率意识、并领悟对分查找算法对于现实应用的价值。
五、重点难点
重点:
分析对分查找算法难点:
程序实现、知识迁移六、教学策略与手段
以流程图的完善为线索,以生动的、较有价值的实例穿插在各个教学环节,辅助学生理解以提高效率为目标,让学生在应用中体会顺序查找与对分查找的效率采用比较、分组讨论、探究教学法综合运用的教学手段七、课前准备
1.学生的学习准备:
掌握查找的概念,预习对分查找法。
2.教师的教学准备:
cctv“幸运52”中猜价格游戏的片段;对分查找算法的演示材料和数据。
3.教学环境的设计与布置:
给学生分组(4-6人一组);八、教学过程
播放cctv“幸运52”中猜价格游戏的片段。
[猜一件物品的价格。
竞猜者说一个价格,再根据主持人提示价格的高低修改下次猜测的范围][小组合作]模仿视频片断,亲身体验猜价格技巧。
由同学研究并指出如何根据高低的提示做出相应策略?
[分组讨论]如果按照“顺序查找”策略来猜价格,情况会怎么样?
[切入正题]
今天我们要学习的就是类似于视频中猜价格策略的一种查找算法——对分查找算法,它还有两种叫法:
折半查找法、二分查找法。
它是在有序的数字系列中查找一个数字,可以先确定待查数字所在的范围,然后逐步缩小范围直到找到或找不到记录。
[学生根据已学知识完成声明数组和赋值,因为此数组不仅在一个过程中有效,故要以通用里声明]
dimd(1to10)asintegerprivatesubform_load()
dimiasintegeri=1
dowhilei=10
d(i)=val(inputbox(请按顺序输入数组中各元素的值,第i个:
))list1.additem(str(d(i)))
i=i+1loopendsub
我们需要用到的变量:
被查找的数key(由用户输入)、最大数的下标high、最小数的下标low、位于数字系列中央的数字为第mid,其中mid=fix(low+high)/2,应满足low≤high。
[学生完成对变量的声明和赋值]dimkeyasintegerdimhighasintegerdimlowasintegerdimmidasinteger
high=10:
low=1
mid=fix(high+low)/2’————————————回顾fix()函数用法key=val(text1.text)’————————————回顾val()函数用法
[结合猜价格策略]先把key与第mid元素进行比较,最好的情况:
key=d(mid),这样可以直接输出key的位置,程序结束;如果keyd(mid),则可以判断被找的数在d(mid)的前方,而d(mid)及其后面部分不可能有key,可以排除,数组的规模缩小近一半,此时可把d(mid)前的元素作为新数字系列的最高位,使其下标置high。
即high=mid-1
[提问]既然需要根据d(mid)和key的大小关系做出不同的决策,则程序实现需要用什么控制结构?
[让学生结合上述分析做此部分流程图片断]
[培养学生由此及彼的能力]
既然keyd(mid)的情况可以如上操作,那keyd(mid)又当如何呢?
请大家思考并小组讨论,之后在上面流程图的基础上划出另一分支。
[学生按流程图写出代码]
ifkey=d(mid)then
msgbox(在第mid个位置!
)elseifkeyd(mid)thenhigh=mid-1
else:
low=mid+1
endif
[引出循环结构在其中的运用]
[教师]每当有了新的high和low,总在算出新mid,再比较d(mid)与key,相等则输出,否则确定新low或新high,这样重复的操作可以用什么控制结构?
[学生]循环结构
[让小组讨论本循环的条件、循环体的组成,并在流程图中体现]
[对照流程图写出代码]
dowhilelow=high
mid=fix((low+high)/2)
ifkey=d(mid)then
msgbox(在第mid个位置!
)exitdo
elseifkeyd(mid)thenhigh=mid-1
else:
low=mid+1endifloop
[知识提升]
对规模为n的数组,通过1次查找折半,新的查找范围不会超过围不会超过
n2
2
n2
,2次查找,新的查找范
,则经过k次查找,所剩的查找范围不会超过
n2
k
。
因此效率比顺序查找逐个排查要高得多。
此程序初步成型,但不够完善,如不能对找不到的情况进行友好反馈,请同学们结合顺序查