算法入门.ppt
《算法入门.ppt》由会员分享,可在线阅读,更多相关《算法入门.ppt(47页珍藏版)》请在冰豆网上搜索。
算法入门算法-程序的灵魂随机数函数数组整数问题平方数问题用算法提高程序的运行速度参考书籍2010年8月宁波大学大学生软件实训基地陈叶芳算法-程序的灵魂硬件硬件:
摩尔定律速度提高约10亿倍.软件软件:
发展相对缓慢对算法研究不足2010年8月宁波大学大学生软件实训基地陈叶芳算法-程序的灵魂哥德巴赫猜想哥德巴赫猜想费马定律费马定律现代数论现代数论的建立和发展的建立和发展大素数大素数公开密钥公开密钥加密密钥加密密钥数字签名数字签名2010年8月宁波大学大学生软件实训基地陈叶芳算法-程序的灵魂算法的描述算法的描述:
自然语言/流程图算法的实现算法的实现:
计算机语言编程,上机实现伪代码:
if(aabb是平方数)printf(“Yesn”);2010年8月宁波大学大学生软件实训基地陈叶芳算法的多样性求多个正整数的最大公约数和最小公倍数的3种算法,如(756,504,630,2226)的最大公约数,最小公倍数。
算法算法11:
分解质因数法:
分解质因数法756=2*2*3*3*3*7504=2*2*2*3*3*7630=2*3*3*5*72226=2*3*7*53最大公约数:
4个数的公因子相乘=2*3*7=42最小公倍数:
在同样的质因数中,选取最多的个数相乘(不重复),即3个2,3个3,1个5,1个7,1个53=2*2*2*3*3*3*5*7*53=4006802010年8月宁波大学大学生软件实训基地陈叶芳算法的多样性算法算法22:
辗转相除:
辗转相除-递推法递推法1.(756,504):
756%504=252,504%252=0,所以(756,504)=2522.(630,252):
630%252=126,252%126=0,所以(630,252)=1263.(2226,126):
2226%126=84,126%84=42,84%42=0,所以(2226,126)=42因此,(756,504,630,2226)的最大公约数为422010年8月宁波大学大学生软件实训基地陈叶芳算法的多样性算法算法22:
辗转相除:
辗转相除-递推法递推法最小公倍数:
1.756,504=756*504/252=15122.1512,630:
先求(1512,630)=126,再1512,630=1512*630/126=75603.7560,2226:
先求(7560,2226)=42,再7560,2226=7560*2226/42=400680所以,756,504,630,2226=4006802010年8月宁波大学大学生软件实训基地陈叶芳算法的多样性算法算法33:
逐次相减法求最大公约数、逐次相除法求最小公倍数:
逐次相减法求最大公约数、逐次相除法求最小公倍数(756,504,630,2226)=(2226,756,630,504)/先从大到小排序=(2226-2*756,756-630,630-504,504)/逐次相减逐次相减,满足A=A-n*B0=(714,126,126,504)再重复上述过程:
=(714,504,126,126)=(714-504,504-3*126,126,126)/逐次相减时逐次相减时不能为0=(210,126,126,126)再重复=(42,42,42,42),因此,最大公约数为422010年8月宁波大学大学生软件实训基地陈叶芳算法的多样性算法算法33:
逐次相减法求最大公约数、逐次相除法求最小公:
逐次相减法求最大公约数、逐次相除法求最小公倍数倍数逐次相除法逐次相除法:
设有若干个数设有若干个数,其中最大的数为其中最大的数为a,a,用用aa的的11倍倍,2,2倍倍,除以除以其余的个数其余的个数,若第若第nn次恰好都能除尽次恰好都能除尽,则此时的则此时的n*an*a即为它们即为它们的最小公倍数的最小公倍数.如本题如本题756,504,630,2226,756,504,630,2226,最大数为最大数为2226,2226,其其180180倍恰好倍恰好能被其余数除尽能被其余数除尽,所以所以,756,504,630,2226=2226*180=4006802010年8月宁波大学大学生软件实训基地陈叶芳算法的奇妙性例1-2+3=?
例=10000*10000/20000.0=?
2010年8月宁波大学大学生软件实训基地陈叶芳算法的奇妙性韩信大点兵。
韩信校场点兵,2人一伍多1人,3人一伍多2人,4人一伍多3人,5人一伍多4人,6人一伍多5人,7人一伍多6人,8人一伍多7人,9人一伍多8人,10人一伍多9人,11人一伍多10人,12人一伍多11人。
请问:
韩信至少有多少兵?
2010年8月宁波大学大学生软件实训基地陈叶芳算法的奇妙性分析:
都是“少1人”,因此,求最小公倍数(再减1)2,3,4,5,6,7,8,9,10,11,12-1=277192010年8月宁波大学大学生软件实训基地陈叶芳算法的奇妙性N个人参加乒乓球单打淘汰赛,至决出冠军需要打多少场?
传统算法:
(1)知道N的具体值;
(2)考虑可能的轮空;(3).创新算法:
N-1场。
(N个人比赛,只有冠军不被淘汰,共需淘汰N-1人,即N-1场)2010年8月宁波大学大学生软件实训基地陈叶芳穷举法编程的瑰宝穷举法(枚举法):
将集合中的元素一一列举出来,验证是否有问题的解。
穷举法:
没有办法的办法,但往往是高效的(算法构造快,程序编写快,运行快)。
穷举法的关键:
如何把实际问题定义成穷举问题,将可能的解限定在一个容易表达的集合内。
-循环+if2010年8月宁波大学大学生软件实训基地陈叶芳随机数函数计算机模拟的基石真随机数真随机数:
掷硬币等。
伪随机数伪随机数:
计算机模拟用,按某种算法计算产生的,是一个固定的序列。
简单:
随机数函数的使用复杂复杂:
随机数函数的原理、算法、质量,对要解决的问题是否可靠/可信2010年8月宁波大学大学生软件实训基地陈叶芳高质量的均匀分布的随机数函数均匀分布的随机数用得最多,而且是其他类型分布的随机数的基础。
质量质量:
均匀性/覆盖性/独立性.算法:
查阅已有的经典算法,如乘法同余法乘法同余法/列表法/平方取中法编写随机数函数doublernd(intx):
生成0和1之间(不包括0和1)均匀分布的随机小数x=0,重复上一随机数x=1,得到一个新的随机数x=-1,第一次使用随机数在头文件rndlib.h中自行定义2010年8月宁波大学大学生软件实训基地陈叶芳高质量的均匀分布的随机数函数编写小学生乘法练习程序,由两位数乘以一位数。
分析:
被乘数a是两位正整数,区间为(10,99),令a=rnd
(1)*90+10,并转换成整型,得到1099之间的数。
同理b=rnd
(1)*8+2,得到29之间的数。
inta,b,c;a=rnd
(1)*90+10;b=rnd
(1)*8+2;printf(“n%d%d=”,a,b);scanf(“%d”,&c);if(c=a*b)2010年8月宁波大学大学生软件实训基地陈叶芳八种常用的随机数函数1、等地铁时间-在区间(a,b)上均匀分布的随机数函数算法:
rnd
(1)*(b-a)+a/在在(a,b)区间上均匀分布的随机数函数区间上均匀分布的随机数函数doubleabjvn(doublea,doubleb)doublef;f=rnd
(1)*(b-a)+a;returnf;2010年8月宁波大学大学生软件实训基地陈叶芳八种常用的随机数函数设地铁每10分钟一趟,乘客到达车站的时间是随机的,试以分钟为单位(不满一分钟按一分钟计),模拟10000名乘客等车时间的人数分布,即等了1分钟、2分钟、10分钟的各有多少人。
inta11,i,k;for(i=1;i贝努利试验-几何分布)算法:
x=lnr/lnq+1doublejihe(doubleq)/几何分布的随机数函数几何分布的随机数函数doublef;f=log(rnd
(1)/log(q)+1.0;/p:
命中概率,命中概率,q:
缺失概率缺失概率returnf;/q=1-p2010年8月宁波大学大学生软件实训基地陈叶芳八种常用的随机数函数设导弹射手命中率为p,射击同一坦克,直到命中为止,模拟所用导弹的发数。
程序运行一次,模拟200次。
P的值由键盘输入。
inta31;/设每次所用导弹数不超过设每次所用导弹数不超过30发发q=1-p;for(i=1;i=200;i+)k=jihe(q);/此次模拟用了此次模拟用了k发子弹发子弹ak+;/用用k发导弹的次数加发导弹的次数加1/ak表示用了表示用了k发导弹才命中的次数发导弹才命中的次数结果:
用结果:
用k发导弹命中的次数有发导弹命中的次数有ak次次2010年8月宁波大学大学生软件实训基地陈叶芳八种常用的随机数函数3、日光灯管的寿命-指数分布的随机数函数算法:
-rdoublezhishu(doublez)/指数分布的随机数函数指数分布的随机数函数doublef;f=-z*log(rnd
(1);/z为给定的一个平均值为给定的一个平均值returnf;/f为正数为正数2010年8月宁波大学大学生软件实训基地陈叶芳八种常用的随机数函数模拟电子管的寿命100次,设其平均寿命t=1000小时。
inta11,i,k;/k不超过不超过10,限制极限寿命,限制极限寿命doubles,t=1000;for(i=1;i10)k=10;ak+;/使用寿命分成了使用寿命分成了10个时间区域,个时间区域,ak表示表示结果:
寿命结果:
寿命k*1000k*1000+1000小时的有小时的有ak次次2010年8月宁波大学大学生软件实训基地陈叶芳八种常用的随机数函数4、n次射击有k次命中-二项分布的随机数函数5、射击至第k次命中的射击次数-负二项分布的随机数函数6、人到齐才开会的等待时间-分布的随机数函数7、一天进入某商店的人数-泊松分布的随机函数8、人身体高度正态分布的随机数函数2010年8月宁波大学大学生软件实训基地陈叶芳数组设计算法的重要手段百灯判熄百灯判熄数组元素变号代替开关有100盏灯,编号1100,分别由相应的100个开关控制。
开始时全部朝上(开,灯亮),然后进行以下操作:
编号凡是为1的倍数的灯反方向拨一次开关;是2的倍数的再反方向拨一次;是3的倍数的再反方向拨一次;是100的倍数的反方向拨一次。
问:
最后为熄灭状态的灯的编号?
2010年8月宁波大学大学生软件实训基地陈叶芳数组设计算法的重要手段分析:
分析:
(1)定义数组a101,a0不用。
ai=1表示第i盏灯为开亮状态,ai=-1表示第i盏灯为熄灭状态。
(2)利用循环。
为数组a的100个元素赋初值1,表示全亮。
(3)利用两重循环,实现拨动开关操作。
外循环k:
1100,步长为1,循环100次,表示100种拨动方法。
内循环i:
k100,步长为k,表示按k的倍数拨动开关。
(4)拨动一次开关用ai=-ai表示。
(5)最后,输出满足ai=-1的i。
同时可以用变量n统计熄灭状态的灯的个数。
2010年8月宁波大学大学生软件实训基地陈叶芳数组设计算法的重要手段inta101,i,k,n=0;for(i=1;i=100;i+)ai=1;/初始化初始化for(k=1;k=100;k+)for(i=k;i=100;i+=k)ai=-ai;/拨动一次开关拨动一次开关2010年8月宁波大学大学生软件实训基地陈叶芳数组设计算法的重要手段打印杨辉三角形打印杨辉三角形数组元素相加胜过组合111121133114641151010512010年8月宁波大学大学生软件实训基地陈叶芳数组设计算法的重要手段分析分析2010年8月宁波大学大学生软件实训基地陈叶芳数组设计算法的重要手段
(1)用二维数组aNN表示,按下三角阵考虑。
(2)第i行的首尾元素为:
ai1=1,aii=1(3)其余元素:
从第3行开始,为其左上角和右上角两元素之和,即aij=ai-1j-1+ai-1j注:
0行0列不用2010年8月宁波大学大学生软件实训基地陈叶芳数组设计算法的重要手段新