当前位置:文档之家› 算法设计与分析答案屈婉玲

算法设计与分析答案屈婉玲

算法设计与分析答案屈婉玲

【篇一:分金块问题的解决思想和算法设计】

s=txt>摘要:在日常生活中,分金块问题是一个常见的问题,人们

总是会面临怎样比较大小。才能利用一种最高效的算法选出其中最

大和最小的金块。本文给出了较为常用的两种算法—蛮力法和分治法。

关键词:分金块问题;蛮力法(非递归);分治法;

points gold bullion problem solving thought and algorithm design

abstract: in daily life, points gold bullion is a common problem, people will always face how to compare size. can use one of

the mostefficient algorithm choose the maximum and

minimum of the gold. this paper gives a more commonly used two kinds of algorithm, brute force method and partition method.

keywords: points gold bullion problem; brute force

method(non recursive); partition method;

1引言

递归调用是一种特殊的嵌套调用,是某个函数调用自己,而不是另

外一个函数。递归调用一种解决方案,一种是逻辑思想,将一个大

工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,

只要先搬走48块,那剩下的一块就能搬完了……,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。

由于回溯法是对解空间的深度优先搜索,因此在一般情况下可用递

归函数来实现回溯法

2问题概述

老板有n个金块,希望最优秀的雇员得到其中最重要的一块,最差

的雇员得到其中最轻的一块。假设有一台比较重量的仪器,如何用

最少的比较次数找出最重和最轻的金块?

理解金块问题:以9以内的实例理解问题。

金块示例

问题:1.最重的是那块?用max标记。

2.最轻的是那块?用min标记。

3 求解分金块问题的常用算法

3.1蛮力法

蛮力法,也称穷举法,是一种简单而直接地解决问题的方法,常常

直接基于问题的描述,因此,也是最容易应用的方法。但是,用蛮

力法设计的算法其时间性能往往是最低的,典型的指数时间算法一

般都是通过蛮力搜索而得到的。即从第一块开始查找,查找哪块最重,哪块最轻。

算法设计:

maxmin(float a[],int n)

{max=a[1];min=a[1];

for(i=2;i=n;i=i+1)

{if(maxa[i])

max=a[i]

else if(mina[i])

min=a[i]

}

return(max, min)

}

step1 将所有金块重量存于数组

step2 将第一个金块同时标记为最重和最轻的金块

step3 将第一个与后一个进行重量的比较,将更重的标记为max,

同时如果现阶段最轻的比后者轻,那么

将后者标记为min。

step4 依次进行比较,最重得到最重的和最轻的max min.

3.2分治法

1典型二分法思想:一种简单的分治法。即当每次将比较大的一个

问题一分为二,形成两个较小的问题,再把每个较小问题一分为二,变为更小的两个问题,……,直到得到容易解决的小问题为止,再解

决所有小问题,然后把小问题的解逐层合并,得到原来大问题的解。

2 用二分法如何解决金块问题?

从两个简单实例谈起:

(1) 假设只有一个金块,重10克,则不需要比较轻重,最重者和最轻

者是同一个金块。即比较0次。

(2) 假设有2个金块,一个重10克,另一个重16克,则

需要比较1次,可以把最重者和最轻者确定下来。

(3) 当有多个金块时(假设6块),则用二分法对其分

解,直到分解为(1)或(2)的情形时,问题很容易解决。

假设6个金块重量如下(以找最轻金块为例):

2 6 4

3 8 1

一分为二(两组):【2 6 4】【3 8 1】

一分为二(四组):【2 6】【4】【3 8】【1】

解较小子问题: 24 3 1

合并子问题解: 2 1

最终的解: 1

3用二分法解决金块问题算法设计:

问题抽象、简化为:在n个元素的集合中寻找最大和最小值元素。

(1)将集合一分为二,变为两个集合,目的是在较小的两个集合中分

别找最大、最小元素。

(2)递归分解较小集合,直到每个集合中的元素个数≤2,然后找出小

集合的最大、最小元素。

(3)合并(回溯):自低向上把子问题的解合并,大元素中取最大者,小元素中取最小者,最后得到元问题的解。

4 用二分法解决金块问题算法描述:

void maxmin(int i,int j,float fmax,float fmin)

{

int mid;

float lmax,lmin,rmax,rmin;

if(i==j)

{

fmax=a[i];

fmin=a[i];

}

else if(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环境下测试brute force method,随机输入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结果正确。

表-1 brute force method实验输入输出参数设置

由于蛮力算法是从第一个金块开始逐一寻找,直到和第n个金块比

较之后才结束,所以最后得到的必然是最重(max)、最轻(min)的金块.

表-2 partition method实验输入输出参数设置

表-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版) 》昊斯特曼(horstmann gay s.)、gary cornell、叶乃

文、邝劲筠机械工业出版社 (2008-06出版)

【篇二:b0301340s-算法分析与设计-课程实验教学大

纲】

s=txt>课程编号:课内总学时:

b0301340s 48

课程名称:实验学时:

算法分析与设计 8

实验类别:□通识基础□学科基础■专业基础□专业

一、实验课程的性质、目的和任务

性质:本实验课程是软件工程专业的专业基础课,该实验是理论课

程的课内上机实验环节。目的:加深学生对算法设计的基本策略和

主要方法的理解,培养学生针对具体的问题,选择合适的数据结构

和设计结构清晰、正确有效的算法的能力。

任务:通过8个课时的实验,学生需要完成分治策略、动态规划法、回溯法和密码算法四个实验内容,掌握为实际问题设计合适的算法、以及结合程序设计语言加以具体实现的技能,锻炼学生运用书本知

识实际解决问题的能力,达到对所学算法思想理解深刻、举一反三

的目的。

每位同学应在实验课前充分复习和理解课堂教学内容,明确实验目

的和任务,对实验题目进行分析,掌握实验原理及过程,选择有效

的算法编程实现,并进行充分测试。在实验中通过独立思考、与同

学讨论、老师辅导答疑相结合的方法完成相应的实验内容。

二、实验内容、学时分配及基本要求

三、考核及实验报告

(一)考核

本课程实验的考核包括:有无缺勤、有无事先准备程序代码、实验

课上是否认真做实验、程序代码和实验结果是否正确、实验报告的

撰写情况等几个方面。实验课成绩由平时实验课的课堂表现、源代

码及实验报告内容综合评定。实验课成绩记入该课程的平时成绩,

约占课程总成绩的15%。

(二)实验报告实验报告的内容:

实验名称、实验目的、实验任务、实验内容(包括系统分析、概要

设计和详细设计)、实验过程描述(包括核心算法和算法分析、程序

代码、测试用例、实验结果分析)、实验小结(包括实验过程中遇到

的问题及体会)。

实验报告的要求:

实验报告以文本形式递交。实验报告要求书写规范、内容完整、文

字通顺、图表清晰。

四、主要仪器设备

硬件:微型计算机。

软件:windows操作系统,visual c++ 6.0。

五、教材及参考书

教材

[1] 陈慧南.算法设计与分析—c++语言描述(第二版).北京:电子工业出版社,2012 参考书

[1] 王晓东. 计算机算法分析与设计. 北京:电子工业出版社,2001年.

[2] thomas h.cormen, charles e.leiserson, ronald l.rivest, clifford stein著. 算法导论. 潘金贵,顾铁成,李成法,叶懋译. 北京:机械工业出版社,2007年.

[3] robert sedgewick, kevin wayne著.算法(第4版). 谢路云译. 北京:人民邮电出版社,2013年.

[4] jon kleinberg, eva tardos著. 算法设计. 张立昂,屈婉玲译. 北京:清华大学出版社,2007年.

[5] sara baase,allen van gelder著. computer algorithms,introduction to design and analysis. 北京:higher education press,2001年.

执笔人:张怡婷审核人:陈志实验院长:陈丹伟

编写完成时间:2014.1.6

附件:设计性实验教学大纲一、实验目的

通过构造一个简单的rsa公开密钥系统,使学生熟悉非对称密钥系统的工作流程,理解加、解密算法的基本原理,能够编程实现生成正确的公有/私有密钥对、用公有密钥对明文进行加密并用私有密钥对密文进行解密的功能,并了解该rsa算法在实际系统中的应用。在该配套实验环节中,达到进一步巩固和加强学生对《算法分析与设计》课程相关知识点的掌握和理解的目的。

二、设计内容

1. 根据题意和加、解密基本原理,设计具体的算法流程。

2. 完成rsa密钥系统的具体实现,使之能够生成正确的公有密钥和私有密钥,并能用公有密钥对明文进行加密、用私有密钥对密文进行解密。

3. 在生成公开/私有密钥对的过程中,培养学生借助已有的成熟算法并加以变换来解决实际应用中新问题的能力。

4. 进一步锻炼学生编程的方法和技巧,提高学生编制清晰、合理、可读性好的应用程序来实现算法的能力。

三、实验要求

要求了解密码学中加/解密的基本原理,掌握数论的基本知识,理解非对称密码体制的著名代表rsa加密算法的工作原理和流程,能够设计并实现一个简单的rsa公开密钥加解密系统。

四、实验报告

该课程的实验是理论课程学习的重要实践环节,实验报告应包括以下几个部分的主要内容:一、实验目的和要求二、实验环境

硬件:微型计算机和打印机。

软件:windows 2000以上操作系统;visual c++ 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”中猜价格游戏的片段。

[猜一件物品的价格。竞猜者说一个价格,再根据主持人提示价格的

高低修改下次猜测的范围] [小组合作]模仿视频片断,亲身体验猜价

格技巧。由同学研究并指出如何根据高低的提示做出相应策略?

[分组讨论]如果按照“顺序查找”策略来猜价格,情况会怎么样?

[切入正题]

今天我们要学习的就是类似于视频中猜价格策略的一种查找算法——对分查找算法,它还有两种叫法:折半查找法、二分查找法。它

是在有序的数字系列中查找一个数字,可以先确定待查数字所在的

范围,然后逐步缩小范围直到找到或找不到记录。

[学生根据已学知识完成声明数组和赋值,因为此数组不仅在一个过

程中有效,故要以通用里声明]

dim d(1 to 10) as integer private sub form_load()

dim i as integer i=1

do while i=10

d(i) = val(inputbox(请按顺序输入数组中各元素的值,第 i 个:)) list1.additem (str(d(i)))

i=i+1 loop end sub

我们需要用到的变量:被查找的数key(由用户输入)、最大数的

下标high、最小数的下标low、位于数字系列中央的数字为第mid,其中mid=fix(low+high)/2,应满足low≤high。

[学生完成对变量的声明和赋值] dim key as integer dim high as integer dim low as integer dim mid as integer

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)又当如何呢?

请大家思考并小组讨论,之后在上面流程图的基础上划出另一分支。 [学生按流程图写出代码]

if key = d(mid) then

msgbox (在第 mid 个位置!) elseif key d(mid) then high =

mid - 1

else: low = mid + 1

end if

[引出循环结构在其中的运用]

[教师] 每当有了新的high和low,总在算出新mid,再比较d(mid)与key,相等则输出,否则确定新low或新high,这样重复的操作

可以用什么控制结构?

[学生] 循环结构

[让小组讨论本循环的条件、循环体的组成,并在流程图中体现]

[对照流程图写出代码]

do while low = high

mid = fix((low + high) / 2)

if key = d(mid) then

msgbox (在第 mid 个位置!)exit do

elseif key d(mid) then high = mid - 1

else: low = mid + 1 end if loop

[知识提升]

对规模为n的数组,通过1次查找折半,新的查找范围不会超过围

不会超过

n2

2

n2

,2次查找,新的查找范

,则经过k次查找,所剩的查找范围不会超过

n2

k

因此效率比顺序查找逐个排查要高得多。

此程序初步成型,但不够完善,如不能对找不到的情况进行友好反馈,请同学们结合顺序查

相关主题
文本预览
相关文档 最新文档