信息技术竞赛培训教程.docx
《信息技术竞赛培训教程.docx》由会员分享,可在线阅读,更多相关《信息技术竞赛培训教程.docx(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、信息技术竞赛培训教程信息技术竞赛培训教程目录第二局部第二局部数据构造数据构造一栈二队列三链表四迭代及递推五递归六搜索及回溯七树及二叉树八排序算法九查找算法十图论根底知识广度优先搜索广度优先搜索第二局部第二局部 算法和数据构造算法和数据构造一一栈栈说到学习和掌握数据构造,很容易让人想到的就是其最本的数据构造模式:栈、队这一讲,我们就来谈谈“栈。“栈的应用很广泛,大家在程序设计中,常遇的一种错误就是“栈超界,那么,“栈为何物呢?栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进展,底部一般是不动的。栈就是一种类
2、似桶堆积物品的数据构造,进展删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈,删除那么称为退栈。栈也称为后进先出表表。一个栈可以用定长为的数组来表示,用一个栈指针指向栈顶。假设,表示栈空,时栈满。进栈时加。退栈时减。当时为下溢。栈指针在运算中永远指向栈顶。、进栈算法假设时,那么给出溢出信息,作出错处理进栈前首先检查栈是否已满,满那么溢出;不满那么作;置栈指针加,指向进栈地址;(),完毕为新进栈的元素;、退栈算法假设,那么给出下溢信息,作出错处理(退栈前先检查是否已为空栈,空那么下溢;不空那么作);(),退栈后的元素赋给;,完毕栈指针减,指向栈顶。进栈、出栈的实现过程程序:;();入栈()
3、;();出栈();对于出栈运算中的“下溢,程序中仅给出了一个标志信息,而在实际应用中,下溢可用来作为控制程序转移的判断标志,是十分有用的。对于入栈运算中的“上溢,那么是一种致命的错误,将使程序无法继续运行,所以要设法防止。堆栈的数组模拟十进制数和其它进制数的转换是实现计算的根本问题,解决方法很多,下面给出一中算法原理:()其中为整除运算,为求余运算。例如:()()运算过程如下:、1、填空:()()()()、下面的程序实现这个转换过程,请补充完整。数制转化程序【】;():);();():);();();();.、火车站列车调度示意图如下,假设调度站两侧的轨道为单向行驶轨道。、1、如果进站的车厢序
4、列为,那么可能的出战车厢序列是什么?、2、如果进展进站的车厢序列为,问能否得到和的出站序列。栈的用途极为广泛,在源程序编译中表达式的计算、过程的嵌套调用和递归调用等都要用到栈,下面以表达式计算为例子加以说明。源程序编译中,假设要把一个含有表达式的赋值语句翻译成正确求值的机器语言,首先应正确地解释表达式。例如,对赋值语句:;(式)其正确的计算结果应该是,但假设在编译程序中简单地按自左向右扫描的原那么进展计算,那么为:这结果显然是错误的。因此,为了使编译程序能够正确地求值,必须事先规定求值的顺序和规那么。通常采用运算符优先数法。一般表达式中会遇到操作数、运算符和语句完毕符等,以算术运算符为例,对每
5、种运算赋予一个优先数,如:运算符:优先数:语句完毕符“;的优先数为零在运算过程中,优先数高的运算符应先进展运算但遇到括号时,应另作处理。按这样的规定,对式自左向右进展运算时,其计算顺序就被唯一地确定下来了。计算顺序确定后,在对表达式进展编译时,一般设立两个栈,一个称为运算符栈,另一个称为操作数栈,以便分别存放表达式中的运算符和操作数。编译程序自左向右扫描表达式直至语句完毕,其处理原那么是:凡遇到操作数,一律进入操作数栈;当遇到运算符时,那么将运算符的优先数及运算符栈中的栈顶元素的优先数相比拟;假设该运算符的优先数大,那么进栈;反之,那么取出栈顶的运算符,并在操作数栈中连续取出两个栈顶元素作为运
6、算对象进展运算,并将运算结果存入操作数栈,然后继续比拟该运算符及栈顶元素的优先数。例如式中,当扫描到“和“时都要将运算符入栈。接着扫描到“号,其优先数小于乘号所以乘号退栈,并执行,将结果再存入操作数栈。再将“号的优先数及运算符栈的栈顶元素“号的优先数相比拟,两者相等,所以再将加号退栈,进展,结果为,再入栈,接着,由于运算栈已空,所以减号入栈。当扫描到“时,操作数入栈。当扫描到“;时,其优先数最低,所以减号退栈并执行,结果为并入栈。因已扫描到语句完毕符,所以表达式的求值完毕,结果为。例题模拟计算机处理算术表达式过程。从键盘上输入算术表达式串只含、运算符,充许含括号,输出算术表达式的值。设输入的表
7、达式串是合法的。分析:建立两个栈,一个是操作数栈,一个是运算符栈,根据运算符的优先级对两个栈进展相应的操作。源程序;:;:;,:;,:;算符入栈运算();运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算();:(,);:(,);*:*;:;:;判断运算符的优先级别,建立标志函数;(,)();(*,)(*,);(:);();();()出站进站(左括号处理;();取数入操作数栈();();(,);(,);)右括号处理 (;();根据标志函数值作运算符入栈或出栈运算处理;();()();(,);.练习题:、读入一英文句子,单词之间用空格或逗号隔开,统计其中单词个数,并输出各个字母出现的频率。(句
8、子末尾不一定用.完毕)如果含有其他的字符,那么只要求输出错误信息及错误类型。含有大写字母 错误类型数字 错误类型其他非法字符 错误类型如 输入:!输出:输入:输出:、2、编码解码:从键盘输入一个英文句子,设计一个编码、解码程序。()编码过程:先键入一个正整数()()当两个表均不空时比拟两表指针指向的项指数,输出指数小的项系数和指数,同时改变该表指针 ();(,);();();(,);();假设两表指针指向的项指数相等,那么两系数相加输出,两表指针同时改变 假设有一表空,那么输出另一表的剩余项 ();(,);();();.源程序二:多项式相加的链表实现;,:;:;,:;:;(:);建立多项式系数
9、、指数链表:;:;();(,);();(,);(:);();();(:);();();();()()();(,);();(,);();(,);();(,);)()(;直至队空为止;();(:)();()();();();()();();();在矩阵中寻找细胞();.四四迭代及递推迭代及递推本次我们想及大家共同探讨一下迭代及递推。在计算机数值程序设计中,迭代及递推是两个重要的根底算法。一、迭代许多的实际问题都能转化为解方程()的实数解的问题。求根可以直接从方程出发,逐步缩小根的存在区间,把根的近似值逐步准确到要以满足具体实际问题的需要为止,该算法称为迭代。迭代的一般原那么可以用一个数学模型来描述
10、,现要求出方程()的解:先设()(),那么方程()可化为(),这就产生了一个迭代算法的数学模型:从某一个数出发,按此迭代模型,求出一个序列:,当小于一个特定值误差许可值时,这时可认定()。也就是说,求出的已经可以作为原方程()根的近似值了。设误差许可值为,那么迭代算法的图如图。图 迭代算法框图迭代算法的关键在于确定迭代函数()。确定()时需保证产生的迭代序列 是否能使两个相邻的数之间的差距越来越小即两数的差值越靠近误差值,我们称这样的序列为收敛序列,因为只有这样才能使根的存在范围越来越小,从而为根的取得创造条件。例 求的算术平方根不使用内部函数。分析:使用迭代算法来解决这个问题,使用迭代法可以
11、先设(),那么求 的算术平方根的近似值就可以转化为求()的正根。列出等价方程(),以()为迭代函数,以为初始近似值,误差值设定为,那么程序可写成:;();()();将的值转为的算术平方根();.程序的输出结果如下:()开场时,迭代函数的根的近似值设定在之间,由于区间宽度大于给定误差许可值,于是再进展迭代运算,产生下一个区间;其宽度仍然大于误差许可值,再产生下一个区间;如此反复,直到区间的宽度小于误差给定值时,那么说明在该区间中,任意选择一个数都可以满足根的近似值要求了。为方便起见,取下该区间的边界置作为近似值。这就是迭代算法的一般原那么的表达了。二、.递推对于一个的序列来说,如果它的通项公式即
12、表达位置及位置上的数据的关系的公式,那么,要求出数列中某项之值是十分容易的。但是,在许多情况下,要得到数列的通项公式是很困难的,甚至无法得到。然而,一个有规律的数列的相邻位置上的数项之间通常存在着一定的关系,我们可以借助的项,利用特定的关系逐项推算出它的后继项的值,如此反复,直到找到所需的那一项为止,这样的方法称为递推算法。递推算法的首要问题是得到相邻的数据项间的关系即递推关系。递推算法避开了求通项公项的麻烦,把一个复杂的问题的求解,分解成了连续的假设干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。例 著名的菲波纳葜()数列,其第一项为,第二项为,从第三项开场,其每一项都是前两
13、项的和。编程求出该数列第项数据。分析:按菲波纳葜数列的原那么,数列为:无疑地,寻找其项数位置及项值的关系即通项公式是非常困难的。而根椐该数列的形成规那么,其有一个的公式即说明了相邻的数据项之间的明显关系。因此,可以其作为递推公式,以项及为起点,逐项产生第项、第项、,直到取得需要的第项为止。在其递推算法的语言实现上,可取、三个变量,分别表示前二项、前一项及当前项,、分别取初值及。第一次通过递推公式得到第三项,并进展移位,即取值、取值,为下次递推作准备;如此反复,经过次的递推,就是第项的值第次产生的是项的值。源程序如下:;()();();(,);.菲波纳葜数列的递推明确地表达了递推算法程序设计的一
14、般原那么,即递推公式取得。例 数字三角形。如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。、一步可沿左斜线向下或右斜线向下走;、角形行数小于等于;、三角形中的数字为,;测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:分析:此题解法有多种,从递推的思想出发,可以设想,当从顶层沿某条路径走到第层向第层前进时,我们的选择一定是沿其下两条可行路径中最大数字的方向前进,为此,我们可以采用倒推的手法,设,存放从,出发到达层的最大值,那么,即为所求的数字总和的最大值。源程序如下:;();();();.五五递归递归在四中,我们了解了迭
15、代及递推。及迭代、递推相对应的算法为递归,本趣谈数据构造,我们就来谈一谈递归算法。递归算法作为计算机程序设计中的一种重要的算法,是较难理解的算法之一。简单地说,递归就是编写这样的一个特殊的过程,该过程体中有一个语句用于调用过程自身称为递归调用。递归过程由于实现了自我的嵌套执行,使这种过程的执行变得复杂起来,其执行的流程可以用图所示。图递归过程的执行流程从图可以看出,递归过程的执行总是一个过程体未执行完,就带着本次执行的结果又进入另一轮过程体的执行,如此反复,不断深入,直到某次过程的执行遇到终止递归调用的条件成立时,那么不再深入,而执行本次的过程体余下的局部,然后又返回到上一次调用的过程体中,执
16、行其余下的局部,如此反复,直到回到起始位置上,才最终完毕整个递归过程的执行,得到相应的执行结果。递归过程的程序设计的核心就是参照这种执行流程,设计出一种适合逐步深入,而后又逐步返回的递归调用模型,以解决实际问题。利用递归调用程序设计技术可以解决很复杂但规律性很强的问题,并且可以使程序变得十分简短。例 利用递归调用手段编程计算!。分析:根椐数学知识,正整数的阶乘为:*()*()*,该阶乘序列可转换为求*()!,而()!以可转换为()*()!,直至转换为*!,而。源程序如下:;();()*;()();();();.在过程中,当时,又调用过程,参数为,这种操作一直持续到为止。例如当时,()的值变为*
17、(),求()又变为*(),当 时递归停顿,逐步返回到第一次调用的初始处,返回结果*,即!。例 利用递归调用技术求菲波纳葜数列的第项。分析:我们已经知道菲波纳葜数列的各数列的产生可用以下公式表示:当时因此当大于时,求第项值可转化为求第项值及第项值的和;而求第项又可转化为求项值及项的和,相应地,求项值可转化为求项值和项值的和;如此反复,直至转化为求第项或第项值,而第 项及第项为值和。源程序:;();();();()();();(,)();.本程序采用了函数递归,函数的执行比拟复杂。函数由于存在着两次的递归调用,使递归调用产生执行流程的二叉树行式,大家可参照图来理解这个执行过程。为方便起见,设定,图
18、中的数码表示递归执行的顺序。图 函数的二叉树执行流程递归调用技术的运用,是在牺牲计算机内存空间和程序执行速度的根底上得到的。因为在递归调用的执行过程中,系统必须花费时间及空间以栈的方式记下每次调用的返回位置地址及每一次过程执行的中间结果,以便当递归调用终止条件成立时,能沿着逐步深入的路线逐步返回,取得这些数据,最终准确地回到初始调用处。比方,同是解决菲波纳葜数列问题的程序,使用递推就比使用递归算法设计的程序执行速度快了许多。当一个问题蕴含着递归关系且构造比拟复杂时,采用一般的算法,不仅给程序的设计带来许多困难,而且也会给设计出的程序带来篇幅大、可读性差的缺点,这时采用递归调用技术来设计程序那么
19、会带来相反的效果。例相传在古印度的布拉玛婆罗门圣庙的僧侣在进展一种被称为汉诺塔的游戏,其装置是一块铜板,上面有三根杆编号、,杆上自下而上、由大到小按顺序串上个金盘如图。游戏的目标是把【演示程序:】杆上的金盘全部移到杆上,并仍原有顺序叠好。条件是每次只能移动一个盘,并且在每次移动都不允许大盘移到小盘之上。现要求利用递归调用技术给出个盘从杆移到杆的移动过程。图 阶汉诺塔分析:这个移动过程很复杂及烦琐,但规律性却很强。使用递归调用技术来解决这个移动过程,先得找到一个递归调用模型。想要得到汉诺塔问题的简单解法,着眼点应该是移动杆最底部的大盘,而不是其顶部的小盘。不考虑个盘而考虑个盘的一般情况。要想将杆
20、上的个盘移至杆,我们可以这样设想:.以盘为临时杆,从杆将至号盘移至杆。.将杆中剩下的第号盘移至杆。.以杆为临时杆,从杆将至号盘移至杆。我们看到,步骤只需移动一次就可以完成;步骤及的操作那么完全一样,唯一区别仅在于各杆的作用有所不同。这样,原问题被转换为及原问题一样性质的、规模小一些的新问题图。即:()可转化为()及()其中中的参数分别表示需移动的盘数、起始盘、临时盘及终止盘,这种转换直至转入的盘数为为止,因为这时已无盘可移了。这就是需要找的递归调用模型。图 阶汉诺塔源程序如下:;();();(,);();()();();.如果说例及例题的无法表达递归算法的独特优点,那么,例的解法那么很能说明问
21、题,因为一般的算法是很难解决这个问题的,而过程只用了个语句就解决这个难题。不过要说明的是,按照汉诺塔的移动原那么,将个盘从杆移动到杆需要移动盘的次数是的次幂减,那么个盘移动次数就是,近亿亿次。这是一个天文数字,即使一台功能很强的现代计算机来解汉诺塔问题,恐怕也需要很长的时间,因此要想得到结果,在运行程序时,输入的可不能太大。据说布拉玛婆罗门圣庙的僧侣声称,汉诺塔游戏完毕就标志着世界末日的到来,现在看来确实是有道理的。因为如果每秒移动一次,个盘那么大约需近亿年,而据科学家以能源角度推算,太阳系的寿命只不过 亿年而已。()非波那契()数列.数列的递归公式如下:11F()21F()12nnnFFF(
22、3n)按照上面的递归公式,可写出如下程序;:;(:):;()();递归左子树()();递归右子树;();();();.递归的应用.经典递归例如塔问题:经典的递归,原问题包含子问题。有些问题或者数据构造本来就是递归描述的,用递归做很自然。.递归及递推利用递归的思想建立递推关系,如由兔子生崽而来的数列。但递推由于没有返回段,因此更为简单,有时可以直接用循环实现。.分治不少分治方法是源于递归思想,或是递归分解合并处理。.回溯规模较小的问题用回溯解决比拟自然。注意递归前后要保证现场的保存和恢复,即正确的转化问题。.动态规划动态规划的子问题重叠性质及递归有某种相似之处。递归动态修改查表是一种不错的建立动
23、态规划模型的方法。.其他其他么,就是不好归类。例如表达式处理,排列组合等。附带说一下,用递归来处理打印方案的问题还是很方便的。求把一个整数无序划分成份互不一样的正整数之和的方法总数。分析 这是一道动态规划题,动态方程如下:()()()()此题可以用循环来实现递推,也可以考虑用递归求解。主过程如下:方案一:(;);()()()()()()();();()()();();方案二:();()()();可以看出,方案一的程序较为冗长,消耗栈空间较大;而方案二较为简洁明了,所用的栈空间也较小,效率较高。因此,使用递归算法也有一个优化问题。算法的简洁及否直接制约了程序的可行性和效率。总结递归使一些复杂的问
24、题处理起来简单明了,尤其在学习算法设计、数据构造时更能体会到这一点。但是,递归在每一次执行时都要为局部变量、返回地址分配栈空间,这就降低了运行效率,也限制了递归的深度。因此,在必要的时候可以只使用递归的思想来求解,而程序那么转用非递归的方式书写。递归习题:.一一.九连环问题:有()个环,拆装这些环的规那么:第一个环可以随意拆装,第二个环只有在第一环已装上时可以拆装;第个环只有在第环已装上,且第,第第环都拆下时可以装拆.编程序描述拆下个环的过程.的所有路径:键盘输入一个含有括号的四那么运算表达式,可能含有多余的括号,编程整理该表达式,去掉所有多余的括号,原表达式中所有变量和运算符相对位置保持不变
25、,并保持及原表达式等价。例:输入表达式应输出表达式()(*)*()()注意输入时不能输出。表达式以字符串输入,长度不超过。输入不要判错。所有变量为单个小写字母。只是要求去掉所有多余括号,不要求对表达式化简。有一个人在一个公共汽车站上,从到观察公共汽车到达本站的情况,该站被多条公共汽车线路所公用,他记下了公共汽车到达本站的时刻。在这个期间内,同一条线路上的公共汽车以一样的时间间隔到站。时间单位用“分表示,从到。每条公共汽车线路上的车至少到达本站两次。在本例的公共汽线路数一定。来自不同线路的公共汽车可能在同一时刻到达本站。不同公共汽车线路的车首次到站时间和或 时间间隔到站的可能一样。如果两条公共汽
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息技术 竞赛 培训 教程
限制150内