1、|&!() E E E 为实现算符优先算法,我们采用两个工作栈。一个称作OPTR,用以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。算法的基本思想是:(1)首先设置操作数栈为空栈,符号“”为运算符的栈底元素;(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd(按字典序排列,同一个命题变元只出现一次);(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。实验2(1)求任意两个集合的交集、并集、差集。(2)求任意一个集合的幂集。(3)求任意一个
2、集合的所有m元子集。(4)求任意个元素的全排列。集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构、数据库理论、开关理论、自动机理论和可计算理论等领域都有广泛的应用。集合的运算规则是集合论中的重要内容。通过该组实验,目的是让学生更加深刻地理解集合的概念和性质,并掌握集合的运算规则等。集合的表示采用列举法,如A=a,b,c,d。ABx|xAxBABx|xAxBABx|xAx BP(A)Ai|iJ,其中Ji|i是二进制数且i。按照(2)求出子集并判断是否符合要求。设S=1,2,3,n,(a1,a2,an)和(b1,b2,bn)是S的两个全排列,若存在i1,2,n,使得对一切j=1,2,i
3、有aj=bj且ai+1bi+1,则称排列(a1,a2,an)字典序的小于(b1,b2,bn)。记为(a1,a2,an)(b1,b2,bn)。若(a1,a2,an)(b1,b2,bn),且不存在(c1,c2,cn)使得(a1,a2,an) (c1,c2,cn)(b1,b2,bn),则称(b1,b2,bn)为(a1,a2,an)的下一个排列。求一个排列(a1,a2,an)的下一个排列的算法如下:(1)求满足关系式aj-1aj的j的最大值,设为i,即i=maxj|aj-1aj(2)求满足关系式ai-1ak的k的最大值,设为j,即j=maxk|ai-1ak(3)ai-1与aj互换得序列(b1,b2,b
4、n)(4)将(b1,b2,bn)中部分bi,bi+1,bn的顺序逆转,得到(b1,b2,bi-1,bn,bi)便是所求得下一个排列。实验3判断任意一个关系是否为自反关系、对称关系、传递关系和等价关系?若是等价关系,求出其所有等价类。关系是集合论中的一个十分重要的概念,关系性质的判定是集合论中的重要内容。通过该组实验,目的是让学生更加深刻地理解关系的概念和性质,并掌握关系性质的判定等。设R AA,(1)若 x(xA xRx),称R是自反的;(2)若 x y(x、yAxRy yRx),称R是对称的;(3)若 x y z(x、y、zAxRyyRz xRz),称R是传递的;(4)若R是自反的、对称的和
5、传递的,则称R是等价关系。在程序实现中,集合和关系用都用集合方式输入。实验4判断任意一个关系是否为函数,若是函数,判定其是否为单射、满射或双射。函数是集合论中的一个十分重要的概念通过该组实验,目的是让学生更加深刻地理解函数的概念和性质,并掌握函数性质的判定等。设A和B为集合,fAB,若对任意的xA,都存在惟一的yB使得xfy成立,则称f为从A到B的函数。设f是A到B的函数,若RfB(或f(A)B),则称f是A到B的满射;若对任意的x1、x2A,x1x2,都有f(x1)f(x2),则称f是A到B的单射;若f既是满射又是单射,则称f是A到B的双射。在程序中集合用列举法表示,关系用集合表示。例如:A
6、=1,2,3,B=a,b,c,A到B上的关系f=,3,c实验5(1)求任意两个整数的最大公约数,及其线性组合式。(2)求任意一个大于2的正整数的唯一素数分解式。数论是主要研究整数性质的一门学科。近几十年来,数论在计算机科学、组合数学、代数编码、密码学、信号的数字处理等领域得到了广泛的应用。通过该组实验,目的是让学生更加深刻地理解素数等概念,并掌握最大公约数的求解方法、素数分解的方法。(1)利用辗转相除法求两个整数的最大公约数。利用穷举法求其线性组合式。(2)利用判断素数的方法求得一个大于2的正整数的所有素数,即得该整数的素数分解式。实验6(1)判断一次同余式ax b(mod m)是否有解,若有
7、解,求出其所有解。(2)已知一次同余方程组:xb1(mod m1)xb2(mod m2)xbk(mod mk)其中,m1、m2、mk是两两互素的k个正整数,k2,求其解。通过该组实验,目的是让学生更加深刻地理解同余、一次同余式和一次同余式组等概念,并掌握一次同余式和一次同余式组的求解方法。(1)先求a和m的最大公约数(a,m)。若(a,m)1,求a和m的最大公约数(a,m)的线性表达式a+m=1,得其惟一解x=(s*b)%m(mod m);否则,判断d是否整除b?若d整除b,令u=a/d,v=m/d,求u和v的最大公约数(u,v)的线性表达式u+v=(u,v),得其d个解:xck(mod m)
8、,k0,1,d1,这里xc(mod m)是x(mod )的惟一解;否则无解。(2)求mm1m2mk,Mimi/m,i=1,k。求mi和Mi的最大公约数(mi,Mi)的线性表达式misi+Miti=1,i=1,k。计算x=b1s1 M1b2s2M2bk skMk求得解:xx%m(mod m)。实验7任意给定一个集合和该集合的任意一个二元运算*,判断该集合关于运算*是否构成半群?若构成半群,是否构成独异点?若是独异点,是否构成群?代数系统是带有运算的集合,代数系统的研究方法和结果在构造可计算数学模型、研究算术计算的复杂性,刻画抽象数据结构,如程序理论、编码理论、数据理论中均有巨大的理论和实际意义。
9、通过该组实验,目的是让学生更加深刻地理解半群、独异点或群的概念和性质,并掌握其判定方法。设集合A=a1,a2,an,*是A上的二元运算。若*满足结合律,则构成半群。若半群存在幺元,则是独异点。若是独异点,且每个元素存在逆元,则构成群。为了实现方便,假定集合A中的元素都是单个字符,且二元运算*由运算表给出。实验8在以下题目中,所有图均为简单图。(1)求图的可达矩阵。(2)求有向图的所有强分图。(3)求有向图的所有单向分图。(4)求图的所有割点。(5)求图的所有割边。(6)求源点到其它各点的所有最短路径。(7)求图的所有关键路径。(8)求最小生成树的两种算法:Krushal算法、Prim算法。(9
10、)求Huffman编码。(10)判断一个图是否为哈密尔顿图。(11)求二部图的所有完备匹配。图论是一个应用十分广泛而又极其有趣的数学分支,以离散对象的二元关系结构为研究对象。图论在网络理论、信息论、控制论和计算机科学等领域都有着广泛的应用。通过该组实验,目的是让学生更加深刻地理解图论中的一些基本概念,并熟悉图在计算机上的表示和运算方法,且能够解决实际图论问题。为了方便,设图G=的结点集为V=0,1,n-1,其邻接矩阵用A表示,可达矩阵用P表示。(1)、(2)、(3)、(10)、(11)中图的邻接矩阵A定义为:(4)、(5)中图的邻接矩阵A定义为:其中,Max表示最大值 。利用Warshall算
11、法求可达矩阵的算法如下:置P=A。i=0。对所有j如果Pj,i1,则对k0,1,n-1,Pj,kPj,kPi,k。i加1。如果in-1,则转到步骤3),否则停止。若P是图G的可达矩阵,PT是P的转置,则PPT的第i行元素为1的列号为下标的结点构成了包含i的强分图,其中AB定义为(AB)ijaijbij。设G 是图G的删去其所有强分图的边之后得到的图,其邻接矩阵用B表示。通过对有向图的分析可得出以下结论:结论1一个强分图的所有结点一定同在或同不在一个单向分图中。结论2图G 的单向分图,要么是孤立结点,要么是不可扩充成回路的通路。结论3对G的结点归并:将G 的每条不可扩展路的结点及其该结点所在G的
12、强分图归并;将完成之后的未处理结点按其所在G的强分图进行归并。这样即可得到G的所有单向分图。于是,求有向图所有单向分图的算法如下:求G的所有强分图。求删去G的强分图的所有边所得子图G 。求图G 的所有不可扩展路。按照结论3对所有结点进行归并,即得G的所有单向分图。判断结点i是否为割点的算法如下:由图G的邻接矩阵A求出子图G-i的邻接矩阵Ai。按照Floyd算法求出子图G-i的最短路径长度矩阵Di。若Di中除主对角线元素外具有Max元,则结点i是割点,否则结点i不是割点。判断边i,j是否为割边的算法如下:由图G的邻接矩阵A求出子图G-i,j的邻接矩阵Ai。按照Floyd算法求出子图G-i,j的最
13、短路径长度矩阵Di。若Di中除主对角线元素外具有Max元,则边i,j是割边,否则边i,j不是割边。图G=的邻接矩阵A按下面方式定义:设S表示已找到从v0出发的最短路径的终点的集合,向量D的每个分量Di表示从始点v0到每个终点vi的最短路径的长度,Succ(u)表示u的后继结点组成的集合。求结点0到其它各结点的所有最短路径的算法描述如下:初始化S及D。S=0,Di=A0,i,i=0,1,n-1。选取j,使得Dj=minDi|iV-S,令S=Sj。修改从0出发到集合V-S上任一结点k可达的最短路径长度。如果Dj+AjkDk则修改Dk为:DkDj+Ajk。重复操作、共n1次,求得从0到其余各结点j的
14、最短路径长度Dj。按如下方法构造矩阵P:根据矩阵P输出所有最短路径。方法是:按照公式Succ(u)=w|Puw=Dw且uw求出每个顶点的后继结点组成的集合;根据求得的结果按秩的大小输出从源点到其他各顶点的所有最短路径。设向量D的每个分量Di表示当前所找到的从源点0到每个终点i的路径的最大长度;向量S的每个分量Si表示从源点0到终点i的最长距离是否已求出,若已求出则Si1,否则Si0;P为按照下述方法对A进行修正后得到的矩阵;Pre(u)表示u的前驱结点组成的集合。则求源点0到汇点n-1的所有关键路径的算法描述如下:初始化矩阵S、D和Pfor(i=0;in;i+)Si=0;S0=1;i+)Di=
15、A0i;P=A;选择k,使得Dk=maxDi|Si=0,并令Sk=1。用Dk修正矩阵P第k1行的值,即:若Pki不等于0,则Pki=Pki+Dk,否则Pki的值不变,i=0,1,n-1。根据矩阵P第k1行的值修正D的值,即:若DiPki,则Di=Pki且Si=0,否则Di的值不变,i=0,1,n-1。判断该过程是否结束,若结束则转向,否则转向。根据矩阵P输出所有关键路径。按照下面公式求出每个顶点的前驱结点组成的集合Pre(u)=w |Pwu=Du且uw,根据求得的结果输出从源点到汇点的所有关键路径。设G是n阶m条边的连通无向带权图。Kruskal算法如下:在G中选取最小权边e1,并置边数i1。
16、当in1时结束,否则转向。设已选择的边为e1,e2,ei,在G中选取不同于e1,e2,ei的边ei1,使得ei1是满足与e1,e2,ei不构成回路且权值最小的边。置i为i1,转向。Prim算法如下:在G中任意选取一结点v1,并置Uv1,置最小生成树的边集TE。 在所有uU,vVU的边u,vE中,选取权值最小的边u,v,将u,v并入TE,同时将v并入U。重复直到UV为止。(9)求Huffman编码(最优二叉树对应的前缀码)/最优二叉树的存储结构typedef struct int weight;/结点的权值 int parent;/指向其双亲结点 char child;/表示该结点是其双亲结点的
17、左或右孩子结点Node,*huffmantree;/Huffman编码的存储结构typedef struct node char data; struct node *next;node,*huffmancode;假定n个叶子结点的所带权值为 1, 2, n,求其对应最优二叉树的赫夫曼编码的算法如下:(1)构造最优二叉树根据给定的n个权值 1, 2, n构成n棵二叉树的集合F=T1,T2,Tn,其中每棵二叉树Ti中只有一个带权为 i的根结点,其左右子树为空。在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。在F中删除
18、这两棵树,同时将新得到的二叉树加入F中。重复和,直到F只含一棵树为止。(2)在得到最优二叉树之后,从每个叶子结点出发走一条从叶子到根的路径即可得到该叶子结点字符对应的Huffman编码。i=0。求从i出发的所有不可扩展的基本路,若存在长度为n的基本路且形成回路,则该图为哈密尔顿图,结束。i=i+1。若i=n-1,该图不是哈密尔顿图,结束。否则,转向。设二部图G=,其中V1=u0,u1,un-1,V2=v0,v1,vm-1,则二部图G可用nm阶矩阵A=(aij)表示,其中定义一个全局变量Bn来存储求出的一个完备匹配,其初值元素全为-1。根据二部图完备匹配的定义可知,若B是二部图G的一个匹配,则向
19、B中添加边,并保证B仍然是一个匹配,直到不能再添加边为止,若B中边数为n,则B一定是二部图G的一个完备匹配。因此,求G的完备匹配的过程实际上是从矩阵A的不同行、不同列选取元素为1的极大元组。该算法采用搜索、试探、前进、回溯等几种运算来实现。实验9设计一个状态输出自动机M,对于输入的一个二进制x,M输出x被3除的余数,并在计算机上实现;自动机理论是离散数学在计算机科学中的重要应用。通过该组实验,目的是让学生更加深刻地理解自动机的相关概念,并能通过程序实现自动机的构造。由于输出是输入二进制数的模3数,而与具体的输入数无关,所以输入字母集是0,1。而输出字母集R=0,1,2。要求机器能“记住”输入二
20、进制数的模3数,所以状态集也有三种状态,即Q=A,B,C,分别对应余数为0、1和2。设为输入二进制数的最后一个数字,则状态转换函数为:,它的输出函数为:因此,M=A,B,C,0,1,0,1,2,A。算法描述如下:(1)输入二进制数。(2)ip=0,设置当前状态为A。(3)从的第一个数字开始,根据状态函数依次修改当前状态,直到最后一个数字为止。(4)输出余数ip。实验10已知一个(n,m)码的一致校验矩阵H,编程求出满足其校验方程的可纠单错的(n,m)码,并能根据给出的接收字求出其对应的发送字。纠错码理论是离散数学在计算机科学中的重要应用。通过该组实验,目的是让学生更加深刻地理解纠错码的相关概念,并能通过程序实现纠正单错。设n、m和k分别为码长、信息位长、校验位长,H为一致校验矩阵,YMB0为群码,E为左陪集的代表元,YMB为译码表。C、E和YMB中每个元素分别存放其二进制数对应的十进制数。求一个接受字的发送字的算法描述如下:(1)输入n、m和H。(2)根据H求得群码YMB0。(3)求,其中1恰在第i位,i=1,2,n.。(3)构造译码表。求群码YMB0的所有左陪集:YMB0,E1 YMB0,E2 YMB0,En YMB0。如果,取一个不在中左陪集的字z,依次类推,直到个左陪集构造完毕。(4)输入接受字,并根据译码表求出其发送字。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1