六种常用算法.docx
- 文档编号:5181159
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:12
- 大小:23.39KB
六种常用算法.docx
《六种常用算法.docx》由会员分享,可在线阅读,更多相关《六种常用算法.docx(12页珍藏版)》请在冰豆网上搜索。
六种常用算法
有条不紊——递推法破解难题
问:
“我对数据结构有了一定了解,但还是不太懂程序。
从经典公式“程序=算法+数据结构”得知,是因为不了解算法。
能不能介绍几种简单的算法,当然从最容易懂的那种开始了?
”
答:
“算法就是能够证明正确的解题步骤,算法有许多种,最简单的无非下面的六种:
递推法、贪心法、列举法、递归法、分治法和模拟法。
刚听名字挺吓人的,其实有好多程序我们平常都见过。
这些算法当中,最最简单的莫过于递推算法了。
下面举例说明。
”
什么是递推法
递推法这种解题方法其实在我们编程的过程中用的很多,只不过没有将其上升到理论的高度罢了。
所谓递推法,就是找出和时间先后相联系或和数的大小相联系的步骤,上一步和下一步和数字的增大或减小有一定的联系。
我们要么从前向后(或从小到大)推导,也可从后向前(或从大到小)推导。
由此得出两种推导方法:
顺推法和倒推法。
请看下面的示例。
示例:
猴子分食桃子
五只猴子采得一堆桃子,猴子彼此约定隔天早起后再分食。
不过,就在半夜里,一只猴子偷偷起来,把桃子均分成五堆后,发现还多一个,它吃掉这桃子,并拿走了其中一堆。
第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃掉这个桃子,并拿走了其中一堆。
第三只,第四只,第五只猴子都依次如此分食桃子。
那么桃子数最少应该有几个呢?
编程简析
怎样编程呢?
先要找一下第N只猴子和其面前桃子数的关系。
如果从第1只开始往第5只找,不好找,但如果思路一变,从第N到第1去,可得出下面的推导式:
第N只猴 第N只猴前桃子数目
5 s5=x
4 s4=s5*5/4+1
3 s3=s4*5/4+1
2 s2=s3*5/4+1
1 s1=s2*5/4+1
s1即为所求。
上面的规律中只要将s1-s5的下标去掉:
s=x
s=s*5/4+1
s=s*5/4+1
s=s*5/4+1
s=s*5/4+1
所以可以用循环语句加以解决。
综观程序的整体结构,最外是一个循环,因为循环次数不定,可以使用While循环,其结束条件则是找到第一个符合条件的数。
为了做出上面while循环的结束条件,还需进一步分析上述规律的特点,要符合题目中的要求,s1-s4四个数必须全部为整数,这个可作为条件。
具体实现请参看源程序。
语言、界面、源程序
(1)语言
程序中通过VirualBASIC6.0语言来实现。
(2)界面
界面非常简单,建立一标准EXE工程,其caption设为“猴子分食桃子”,一切OK。
我们将代码加给Form_Click()即窗体的单击事件,将来运行时,我们只要用鼠标单击一下窗体,程序就执行了。
(3)源程序
OptionExplicit
PrivateSubForm_Click()
Dimx,s,k,iAsInteger'声明变量
x=6
k=0'整除标志
Whilek<>4
s=x'第5只猴子时总数
k=0
Fori=4To1Step-1'第4-1只时的数量
s=s*5/4+1
IfInt(s)=sThen'符合情况则将整除标志加1
k=k+1
EndIf
Nexti
x=x+5'第次增5
Wend
Prints'输出
EndSub
(上程序在VB60Win2000下调试通过)
小结
上面应用的推导方法就是倒推法。
生活中的更多问题采用顺推法就可得到,也即从1-N,但不论倒推还是顺推,能递推出并解出问题是我们的本意。
稳扎稳打——贪心法破解难题
问:
“算法除了递推法,该轮到贪心法了吧,从字面上理解,这种方法有些贪得无厌还是…?
”
答:
“基本算法中的递推法是我们最常使用的,贪心法是另一种有意思的算法。
贪心法不仅仅是贪婪,而且是每一步都贪婪!
下面举例说明。
”
什么是贪心法
贪心法就是做一种目前最贪婪的行动,一步步解决问题。
贪心法和递推法有相似之外,也是从问题的某一个初始解出发,向给定的目标递推,但不同的是每一步不是依据某一个固定的递推式,而是做一个当时看似最佳的贪心选择,不断地将问题归结为更小的相似的问题。
示例:
删数问题
链盘输入一个高精度的数N,去掉任意S个数字后剩下的数字按原左右次序组成一个新的正整数,编程对于给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
为了便于操作,将N做为字符串的形式输入,可以使用尽可能逼近目标的贪心算法来完成,删数的过程中是一个一个进行删除的,为了保证最后得到的数最小,每一步总是要删除使剩下的数最小的数字。
之所以做出这样贪心的选择,是因为删S个数字的最优解,包含了删除一个数字的子问题的最优解。
为了实现上述目的,我们可以进行S次选择,每次都选择N中最大的数字,此数字选择后将不再参与下次的选择。
具体实现请看源程序。
语言、界面、源程序
(1)语言
程序中通过VirualBASIC6.0语言来实现。
(2)界面
界面非常简单,建立一标准EXE工程,其caption设为“删数问题”。
放入三个文本框和两个按钮,文本框起到输入两个数和输出结果的作用,按钮用来控制执行,再放入三个标签起到说明的作用。
(3)源程序
PrivateSubCmdDelnum_Click()'开始删数按钮
DimiAsInteger
DimjAsInteger
DimnAsString'原数
DimsAsInteger'删数的个数
DimnlengthAsInteger'N的长度
Dima()AsInteger'放位数数组
DimkAsInteger'记录最大值位置
TxtOutput.Text=""
n=TxtNum.Text
s=Val(TxtS.Text)
nlength=Len(n)
ReDima(nlength-1)
'将各位的值放入数组
Fori=0Tonlength-1
a(i)=Mid(n,i+1,1)
Nexti
'执行贪心算法s步
Forj=1Tos
k=0
Fori=1Tonlength-j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)