ImageVerifierCode 换一换
格式:DOC , 页数:13 ,大小:145.50KB ,
资源ID:6628202      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6628202.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(plc编程常用算法.doc)为本站会员(hwpkd79526)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

plc编程常用算法.doc

1、编程算法分析 作者:弈宇风尘 E-mail: 第 1 页时间:2019-4-17 8:08:33常用算法一. 基本概念:1. 算法:就是解决问题方法的精确描述。并不是所有问题都有算法,有些问题经研究可行,则相应有算法;而有些问题不能说明可行,则表示没有相应算法。算法具有以下性质:是一有穷动作的序列;动作序列仅有一个初始动作;序列中每个动作的后继动作是确定的;序列的终止表示问题得到解答或问题没有解答2. 算法的分类:数值的和非数值的数值的算法是以数学方式表示的问题求数值解的方法,如:代数方程计算、矩阵计算、线性方程组求解、函数方程求解等;非数值的算法是求非数值解的方法,如排序查找、模式匹配、排列

2、模拟、表格处理、文字处理等。3. 算法设计:主要是针对各类具体问题设计良好的算法及研究设计算法的规律和方法。4. 常用的算法设计方法:数值算法:迭代法、递归法、插值法等;非数值算法:分治法、贪婪法、回溯法等。5. 算法分析:是对设计出的每一个具体的算法,利用数学工具,讨论各种复杂度。算法的复杂度分时间复杂度和空间复杂度。二. 常用数值计算算法1. 迭代法迭代法适用于方程(或方程组 )求解,是使用间接方法求方程近似根的一种常用算法。(参见清华版PASCAL 程序设计 P89 练习4.23设方程 f(x)=0,该方法将方程表示为等价形式:x=g(x) ,或一般地将 f(x)拆成两个函数 f1、f

3、2,即 f(x)= f1(x)-f2(x) =0,因而有 f1(x)=f2(x)。其中 f1(x)是这样一个函数,对于任意数 c,容易求出 f1(x)=c的精确度很高的实根。迭代法求解算法如下:(1). 首先选一个 x 的近似根 x0,从 x0 出发,代入右面函数,并解方程 f1(x)=f2(x0)得到下一个近似根 x1;(2). 将上次近似根 x1 代入右面函数,并解方程 f1(x)=f2(x1),得到又一个近似根 x2(3). 重复(2)的计算,得到一系列近似根编程算法分析 作者:弈宇风尘 E-mail: 第 2 页时间:2019-4-17 8:08:33O/ t1 t2x0,x1,x2,

4、xi,xi+1,xn,;若方程有根,这数列收敛于方程的根,若满足 ,则1nx认为 xn 是方程的近似根。例 1:迭代计算 n!、Fibonacci(斐波那契)数列 (详见清华版PASCAL 程序设计P59-62 例 4.3,4.4)例 2:计算 直到最后一项的绝对.!75!3)si(xx值小于 10-7 时停止计算,x 由键盘输入。( 详见清华版PASCAL程序设计P72 例 4.11)练习:清华版PASCAL 程序设计习题与选解P18 习题4.23,4.382. 递推法递推法实际上是需要抽象为一种递推关系求解,此方法通常表现为两种方式:方式一是从简单推到一般;方式二是将一个复杂问题逐步推到一

5、个已知解的简单问题。这两种方式反映了两种不同的递推方向,前者往往用于计算级数,后者与“回归”配合成为一种特殊的算法递归法。3. 递归法在数学中几个熟知的递归定义:(1). 时当 时当 0 !)1( !nn(2). 树结构:a)O 是树(空树);b) 若 t1 和 t2 是树,则是树。例 3:递归计算 n!;(详见清华版PASCAL 程序设计P108 例5.8)例 4:第二届初中组一、6第二届初中组一、7提示:利用 y=(ANX+AN-1)X+AN-2)X+AN-3)+A1)X+A0第七届初中组三、1练习:计算 Fibonacci(斐波那契 )数列 时当 1 102nFibin4. 插值法也称为

6、内插法。在实际问题中出现的函数 f(x),往往只知道它在编程算法分析 作者:弈宇风尘 E-mail: 第 3 页时间:2019-4-17 8:08:33某区间中若干点的函数值,这时作出适当的特定函数,使得在这些点上取已知值,并且在这区间内其它各点上就用这特定函数所取的值作为函数 f(x)的近似值,这方法称为“插值法” 。如果这特定函数是多项式,就称之为“插值多项式”或“内插多项式” 。(常见用于高等代数中的计算)三. 常用非数值计算算法1. 穷举搜索法穷举所有可能情形,并从中找出符合要求的解。最直观的是联系循环的算法。例 5:百钱买百鸡问题;第一届初中组 3(也可用累加法)第七届初中组四、2输

7、出 1-100 内的素数;验证哥德巴赫猜想 (详见清华版PASCAL 程序设计P82-86 例 4.16,4.17)例 6:找出 n 个自然数(1,2,3,n)中 r 个数的组合当 n=5,r=3 时,约定前一个数应大于后一个数,有:543 542 541 532 531 521 432 431 421 321可简单地用三重循环进行搜索,算法如下:for i:=5 downto 1 dofor j:=5 downto 1 dofor k:=5 downto 1 doif (ik) and (jj) and (jk)then writeln(i,j,k);或者for i:=5 downto 3

8、dofor j:=i-1 downto 3-1 dofor k:=j-1 downto 1 doif (ik) and (jj) and (jk)then writeln(i,j,k);2. 递归法例如:在例 6 中,可首先固定第一位数(如 5),其后是在另 4 个数中再“组合”2 个数。这就将“5 个数中 3 个数的组合”推到了 “4 个数中 2 个数的组合”上去了。第一位数可以是 nr(如 5 3), n 个数中 r 个数组合递推为 n-1 个数中 r-1 个数的组合,这是一个递归的算法:procedure comb(n,r:integer);var i,temp:integer;begi

9、n编程算法分析 作者:弈宇风尘 E-mail: 第 4 页时间:2019-4-17 8:08:33for i:=n downto r doif (ir)then begin temp:=1 while temp1) then comb(i-1,r-1) 递推到下一情形 else writeln;end;例 7:求 m 与 n 的最大公约数;汉诺塔游戏 (Tower of Hanoi) (详见清华版PASCAL 程序设计P109-P112 例 5.9,5.10)例 8:第六届初中组二、2 第五届高中组二、第五届初中组五3. 回溯法一种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时

10、,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足条件的某个状态的点称为“回溯点” 。例如:在例 6 中将自然数排列在数组 A 中:A1 A2 A35 4 35 4 23 2 1排数时从 A1A2 A3,后一个至少比前一个数小 1,并且应满足 ri+Arir 这个关系。若 ri+Arir 就要回溯,该关系就是回溯条件。为直观起见,当输出一组组合数后,若最后一位为 1,也应作一次回溯(若不回,便由上述回溯条件处理) 。算法如下:procedure comb2(n,r,am:integer);var j,ri:integer;beginri=1;a1=

11、n;repeatif (rir) 是否回溯then begin编程算法分析 作者:弈宇风尘 E-mail: 第 5 页时间:2019-4-17 8:08:33ca b fedari+1:=ari+1;ri:=ri+1end;else beginri:=ri-1; ari:=ari-1 回溯end;else beginfor j:=1 to r do write(aj);writeln;if (ar=1) 是否回溯then begin ri:=ri-1; ari:=ari-1 回溯end;else ari:=ari-1end;until (a12,则 T(n)是在大小为 n/2 的集合上两次调用

12、 MAXMIN(第 5、6步所需的比较次数加上第 7 步的两次比较所得的总次数,即。经递推 T(n)=3n/2-2,对于在集合 S 的2n )/(2 1)当当Tn编程算法分析 作者:弈宇风尘 E-mail: 第 7 页时间:2019-4-17 8:08:33元素间进行比较的次数来说,这种算法是最优的。例 16:设有 n 个选手的循环比赛(n=2 m),要求每名选手要与其他n-1 名选手都赛一次。每名选手每天比赛一次,循环赛共进行 n-1 天,要求每天没有选手轮空。例如 m=3,见下表,用分治法将 (2m*2m)矩阵分成四块,每块是(2 m-1*2m-1)的矩阵,它应是对称的( ),再对ABA

13、与 B 均是(2 m-1*2m-1)的矩阵分成四块,直至(2*2)的矩阵定出每个元素的值,再按对称关系构造出比赛表。算法程序略。对手 第一天第二天第三天第四天第五天第六天第七天1 2 3 4 5 6 7 82 1 4 3 6 5 8 73 4 1 2 7 8 5 64 3 2 1 8 7 6 55 6 7 8 1 2 3 46 5 8 7 2 1 4 37 8 5 6 3 4 1 2选手8 7 6 5 4 3 2 1四. 排序1. 插入排序设待排序的记录为(R 1,R2,Rn),插入排序的基本思想是把记录Ri(2in)插入到一列已排好序的记录 R1,R2,Ri-1(1in) 中,使得长度为 I

14、 的一系列记录也是排好序的。(1). 直接插入排序若记录 R1,R2,Ri-1 已按关键码有序,即对应的关键码有K1K 2K i-1,将 Ki与 Ki-1 ,Ki-2 ,K1依次比较,一旦 Ki大于或等于某个 Kj(1ji-1)时,把Rj+1, Rj+2, Ri-1 后移一个位置,并将 Rj 插在第 j+1 个位置上。在直接插入排序中,若待排序的记录已有序,总共比较 Cn-1次;若记录是完全反序的,则比较 C23n次。直接插入排序可用顺序存储和链接存储。2n编程算法分析 作者:弈宇风尘 E-mail: 第 8 页时间:2019-4-17 8:08:33例 17:清华版PASCAL 程序设计P1

15、71 习题 7.8(2). 二分法插入排序在直接插入算法中,确定 Ri(i=2,n)插入位置的方法是将它与前面 i-1 个记录依次比较,由于前 i-1 个记录已按关键码有序,可以用二分法较快地找到 Ri 的插入点。首先取 ,21im比较 Rm 与 Ri 的关键码。若 Ri 的关键码小于 Rm 的关键码,则在R1,R2,Rm-1范围内再用二分法,否则在Rm+ 1,Rn范围内再用二分法。如此反复,直至最后找到 Ri 的插入位置。当 n 较大时,二分法插入排序比较次数比直接插入排序的最多比较次数 少得多,但比直接插入排序的最少比较次2数(n-1 )大。二分法插入排序只能采用顺序存储。2. 选择排序又

16、称为直接选择排序。在待排序的 n 个记录中先选出关键码最大的记录,将它送到第 n 个位置上,然后再从其余 n-1 个记录中选出关键码最大的记录送到第 n-1 个位置上,直至选择了 n-1 个记录。选择排序比较次数共有 C(n-1)+2=n(n-1)/2 (详见清华版PASCAL 程序设计P145-147)3. 冒泡排序这种排序方法从表的一端开始,依次比较相邻两个记录的关键码Ri.key 和 RI1.key,若 Ri.keyRI+1.key,则交换 Ri和Ri+1。假设从表的左端开始,当 i 从 0 到 n-2 对表扫描一趟后,具有最大关键码的记录将被移到最右边的位置上。作 n-1 趟扫描将完成

17、对 n 个记录的排序,但完成 n 个记录的排序不一定都要进行 n-1 趟扫描,如果在某趟扫描中没有发生交换,则排序工作已完成,此后的扫描便不必进行。如果待排序的诸记录在排序前已按关键码排好序,则用冒泡排序算法只需一趟扫描便完成排序,比较次数为 Cn-1 。如果待排序的记录完全反序,即已由大至小排序,则比较次数 Cn(n-1)/2 (详见清华版PASCAL 程序设计 编程算法分析 作者:弈宇风尘 E-mail: 第 9 页时间:2019-4-17 8:08:33P148-150)4. 希尔排序在直接插入排序和冒泡排序中,只比较相邻的记录,一次比较至多将记录移动一个位置。希尔排序是对此两种排序的推

18、广。算法先将记录按某个增量 d 分成若干组,每组中记录的下标相差 d。对每组中的记录用某种方法(前两种)进行排序,然后再用一个较小的增量对记录进行分组,在每组中再进行排序,当增量减至 1 时,整个记录被分成一组,排序完成。例如:设待排序的记录的关键码为:94 32 40 90 99 80 46 21 69 28 64 73 85 54取增量序列为:5,3,1,当增量 d=5 时,整个记录被分成五组:再取增量为 1,排序结果为:21 28 32 40 46 54 64 69 73 80 85 90 94 995. 快速排序选取表中某个记录的关键码 K 作为基准,将表划分成左、右两个子表:左子表中

19、各记录的关键码都小于等于 K,右子表中各记录的关键码都大于等于 K,然后用同样的方法递归地处理这两个子表。比较次数 C(1)=0,C(2)=2+C(1)=2,C(3)=3+C(2)=5,C(n)=n+C(n-1)=(n+2)(n-1)/2编程算法分析 作者:弈宇风尘 E-mail: 第 10 页时间:2019-4-17 8:08:33上图说明了 13 个记录的表进行第 1 次划分的过程。取表的中间一个记录的关键码 275 作为基准,划分时用两个指针变量 i 和 j 扫描表,变量 i 从表头向右扫描,直至遇到一个关键码大于或等于基准的记录;变量 j 从表尾向左扫描,直至遇到一个关键码小于或等于基

20、准的记录;接着交换 Ri 和 Rj。指针 i 和 j 继续向两端前进,进行比较、交换。当i 和 j 交叉(即 i 处于 j 的右边)时,表中各记录都与基准比较过,表被分成左、右两部分,左边各记录的关键码小于或等于右边各记录的关键码。6. 堆排序是对选择排序的改进。为了避免在选择排序中出现的每趟选择最大关键码的记录时的某些重复的比较,可以采用树形选择方法。设待排序的 n 个记录的关键码为 K1,K2,Kn,先两两比较 K1:K2, K3:K4, Kn-1:Kn,然后用同样的方法比较每对中的较小者,直至找出最小的关键码。另一种改进的堆排序方法是,将待排序的 n 个记录(R 1,R2,Rn)看成是有

21、 n 个结点的一棵完全二叉树,树中结点满足下列条件:任何一个非叶结点的值(这个结点上记录的关键码)都大于或等于它的子女结点的值,因此堆的根在树中具有最大的关键码。这样得到的序列将是非递减的。7. 归并排序是把两个或两个以上已排好序的表组合在一起,产生一个新的排好序的表。方法如下:(1). 若两个表有一个为空,则无须归并编程算法分析 作者:弈宇风尘 E-mail: 第 11 页时间:2019-4-17 8:08:33(2). 若两个表都非空,则比较 p 和 q(两个表的头指针)所指结点的关键码,将较小者插入第三个表中,并前进相应的指针。重复这一步;(3). 若有一个表先到达表尾,则把另一个表的剩

22、余部分插入到第三个表中。例 18:第五届初中组五8. 各种排序方法的比较 直接插入排序在记录数目较少且是基本有序时是最佳的; 选择排序是比较次数不依赖记录的初始排列,且记录移动较少; 冒泡排序的性能较差; 希尔排序是对插入排序和冒泡排序的推广,在记录移动时可能消去多个反序,算法时间可能较短; 快速排序是目前所有排序中平均性能最好的方法,但在最坏情况下年耗时间最多; 堆排序在 n 较大时非常有效; 归并排序可以看成是插入排序的扩充。例 19:第六届初中组 1、109. 其它排序方法例 20:第七届初中组四、1五. 查找查找又称为检索,它往往是程序中最耗费时间的操作,使用何种存储结构和查找算法对程

23、序的性能有本质的差别,因此,在讨论各种查找算法时都应指明所用的存储结构。TYPE element=RECORD 定义记录类型key: keytype 值为关键字的域recs: rectype 记录的其它域END;sqlist=ARRAY0n OF element;1. 顺序查找又称为线性查找,对给定的关键码值 K,从表的一端开始,依次检查表中每个记录的关键码,直至找到所需灌到达表的另一端。FUNCTION seqsrch(r:sqlist;K:keytype):integer;Beginr0.key:=K; i:=n;while rI.keyK do i:=i-1return(i)编程算法分析

24、 作者:弈宇风尘 E-mail: 第 12 页时间:2019-4-17 8:08:33end;K 为给定值,函数 seqsrch 值为关键码等于 K 的记录在表 r 中的序号,值为零时表明查找不成功(参考清华版PASCAL 程序设计习题与选解P35 习题 7.23)2. 二分查找又称为折半查找。当表中记录按关键码有序时(有序表) ,可以采用二分查找法。先确定待查记录的范围(区间) ,然后逐步缩小范围直到找到或找不到该记录为止。用两个指针 low 和 hig 分别指示待查元素所在范围的下界和上界,并用指针 mid 指示中间元素。在开始进行查找时,low 和 hig 的初值分别指2higlowmi

25、d向第 1 个和第 n 个元素。FUNCTION binsrch(r:sqlist;K:keytype):integer;Beginlow:=1; hig:=n;while lowrmid.key: low:=mid+1;k=rmid.key: return(mid); 查找成功krmid.key: hig:=mid-1end; return(0)end;(参考清华版PASCAL 程序设计习题与选解P35 习题 7.24)例 21:第七届初中组一、19;第六届初中组一、143. 分块查找又称为索引顺序查找,是顺序查找的改进方法。是把表分成若干块,每块中记录的存储顺序是任意的,但块与块之间必须按关键码有序,即第一块中任一记录的关键码都小于第二块中各记录的关键码,如此类推。这种查找方法要求除表本身外,尚需建立一个索引表,索引表中的一项对应于表的一块,它含有这编程算法分析 作者:弈宇风尘 E-mail: 第 13 页时间:2019-4-17 8:08:33一块中的最大关键码的指向块内第一个记录位置的指针,索引表中各项按关键码有序。分块查找的过程分两步进行:先查找索引表(可以用上述两种方法) ,确定要找的记录在哪一块;然后再在相应的块中查找。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报