离散数学上机实验指导Word文档格式.docx
《离散数学上机实验指导Word文档格式.docx》由会员分享,可在线阅读,更多相关《离散数学上机实验指导Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
|
&
!
(
)
@
><<<<<>>
>><<<<>>
>>><<<>>
>>>><<>>
>>>>><>>
<<<<<<=E
>>>>>E>>
<<<<<<E=
为实现算符优先算法,我们采用两个工作栈。
一个称作OPTR,用以寄存运算符;
另一个称作OPND,用以寄存操作数或运算结果。
算法的基本思想是:
(1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素;
(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd(按字典序排列,同一个命题变元只出现一次);
(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。
实验2
(1)求任意两个集合的交集、并集、差集。
(2)求任意一个集合的幂集。
(3)求任意一个集合的所有m元子集。
(4)求任意个元素的全排列。
集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构、数据库理论、开关理论、自动机理论和可计算理论等领域都有广泛的应用。
集合的运算规则是集合论中的重要内容。
通过该组实验,目的是让学生更加深刻地理解集合的概念和性质,并掌握集合的运算规则等。
集合的表示采用列举法,如A={a,b,c,d}。
A∩B={x|x∈A∧x∈B}
A∪B={x|x∈A∨x∈B}
A-B={x|x∈A∧xB}
P(A)={Ai|i∈J},其中J={i|i是二进制数且
≤i≤
}。
按照
(2)求出子集并判断是否符合要求。
设S={1,2,3,…,n},(a1,a2,…,an)和(b1,b2,…,bn)是S的两个全排列,若存在i∈{1,2,…,n},使得对一切j=1,2,…,i有aj=bj且ai+1<
bi+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-1<
aj的j的最大值,设为i,即i=max{j|aj-1<
aj}
(2)求满足关系式ai-1<
ak的k的最大值,设为j,即j=max{k|ai-1<
ak}
(3)ai-1与aj互换得序列(b1,b2,…,bn)
(4)将(b1,b2,…,bn)中部分bi,bi+1,…,bn的顺序逆转,得到(b1,b2,…,bi-1,bn,…,bi)便是所求得下一个排列。
实验3
判断任意一个关系是否为自反关系、对称关系、传递关系和等价关系?
若是等价关系,求出其所有等价类。
关系是集合论中的一个十分重要的概念,关系性质的判定是集合论中的重要内容。
通过该组实验,目的是让学生更加深刻地理解关系的概念和性质,并掌握关系性质的判定等。
设RA×
A,
(1)若x(x∈AxRx),称R是自反的;
(2)若xy(x、y∈A∧xRyyRx),称R是对称的;
(3)若xyz(x、y、z∈A∧xRy∧yRzxRz),称R是传递的;
(4)若R是自反的、对称的和传递的,则称R是等价关系。
在程序实现中,集合和关系用都用集合方式输入。
实验4
判断任意一个关系是否为函数,若是函数,判定其是否为单射、满射或双射。
函数是集合论中的一个十分重要的概念通过该组实验,目的是让学生更加深刻地理解函数的概念和性质,并掌握函数性质的判定等。
设A和B为集合,fA×
B,若对任意的x∈A,都存在惟一的y∈B使得xfy成立,则称f为从A到B的函数。
设f是A到B的函数,若Rf=B(或f(A)=B),则称f是A到B的满射;
若对任意的x1、x2∈A,x1≠x2,都有f(x1)≠f(x2),则称f是A到B的单射;
若f既是满射又是单射,则称f是A到B的双射。
在程序中集合用列举法表示,关系用集合表示。
例如:
A={1,2,3},B={a,b,c},A到B上的关系f={<
1,a>
,<
2,b>
3,c>
实验5
(1)求任意两个整数的最大公约数,及其线性组合式。
(2)求任意一个大于2的正整数的唯一素数分解式。
数论是主要研究整数性质的一门学科。
近几十年来,数论在计算机科学、组合数学、代数编码、密码学、信号的数字处理等领域得到了广泛的应用。
通过该组实验,目的是让学生更加深刻地理解素数等概念,并掌握最大公约数的求解方法、素数分解的方法。
(1)利用辗转相除法求两个整数的最大公约数。
利用穷举法求其线性组合式。
(2)利用判断素数的方法求得一个大于2的正整数的所有素数,即得该整数的素数分解式。
实验6
(1)判断一次同余式axb(modm)是否有解,若有解,求出其所有解。
(2)已知一次同余方程组:
x≡b1(modm1)
x≡b2(modm2)
…
x≡bk(modmk)
其中,m1、m2、…、mk是两两互素的k个正整数,k≥2,求其解。
通过该组实验,目的是让学生更加深刻地理解同余、一次同余式和一次同余式组等概念,并掌握一次同余式和一次同余式组的求解方法。
(1)先求a和m的最大公约数(a,m)。
若(a,m)=1,求a和m的最大公约数(a,m)的线性表达式a
+m
=1,得其惟一解x=(s*b)%m(modm);
否则,判断d是否整除b?
若d整除b,令u=a/d,v=m/d,求u和v的最大公约数(u,v)的线性表达式u
+v
=(u,v),得其d个解:
x≡c+k
(modm),k=0,1,…,d-1,这里x≡c(modm)是
x≡
(mod
)的惟一解;
否则无解。
(2)求m=m1m2…mk,Mi=mi/m,i=1,…,k。
求mi和Mi的最大公约数(mi,Mi)的线性表达式misi+Miti=1,i=1,…,k。
计算x=b1s1M1+b2s2M2+…+bkskMk
求得解:
x≡x%m(modm)。
实验7
任意给定一个集合和该集合的任意一个二元运算*,判断该集合关于运算*是否构成半群?
若构成半群,是否构成独异点?
若是独异点,是否构成群?
代数系统是带有运算的集合,代数系统的研究方法和结果在构造可计算数学模型、研究算术计算的复杂性,刻画抽象数据结构,如程序理论、编码理论、数据理论中均有巨大的理论和实际意义。
通过该组实验,目的是让学生更加深刻地理解半群、独异点或群的概念和性质,并掌握其判定方法。
设集合A={a1,a2,…,an},*是A上的二元运算。
若*满足结合律,则<
A,*>
构成半群。
若半群<
存在幺元,则<
是独异点。
若<
是独异点,且每个元素存在逆元,则<
构成群。
为了实现方便,假定集合A中的元素都是单个字符,且二元运算*由运算表给出。
实验8
在以下题目中,所有图均为简单图。
(1)求图的可达矩阵。
(2)求有向图的所有强分图。
(3)求有向图的所有单向分图。
(4)求图的所有割点。
(5)求图的所有割边。
(6)求源点到其它各点的所有最短路径。
(7)求图的所有关键路径。
(8)求最小生成树的两种算法:
Krushal算法、Prim算法。
(9)求Huffman编码。
(10)判断一个图是否为哈密尔顿图。
(11)求二部图的所有完备匹配。
图论是一个应用十分广泛而又极其有趣的数学分支,以离散对象的二元关系结构为研究对象。
图论在网络理论、信息论、控制论和计算机科学等领域都有着广泛的应用。
通过该组实验,目的是让学生更加深刻地理解图论中的一些基本概念,并熟悉图在计算机上的表示和运算方法,且能够解决实际图论问题。
为了方便,设图G=<
V,E>
的结点集为V={0,1,…,n-1},其邻接矩阵用A表示,可达矩阵用P表示。
(1)、
(2)、(3)、(10)、(11)中图的邻接矩阵A定义为:
(4)、(5)中图的邻接矩阵A定义为:
其中,Max表示最大值。
利用Warshall算法求可达矩阵的算法如下:
①置P=A。
②i=0。
③对所有j如果P[j,i]=1,则对k=0,1,…,n-1,P[j,k]=P[j,k]∨P[i,k]。
④i加1。
⑤如果i≤n-1,则转到步骤3),否则停止。
若P是图G的可达矩阵,PT是P的转置,则P∧PT的第i行元素为1的列号为下标的结点构成了包含i的强分图,其中A∧B定义为(A∧B)ij=aij∧bij。
设G是图G的删去其所有强分图的边之后得到的图,其邻接矩阵用B表示。
通过对有向图的分析可得出以下结论:
结论1一个强分图的所有结点一定同在或同不在一个单向分图中。
结论2图G的单向分图,要么是孤立结点,要么是不可扩充成回路的通路。
结论3对G的结点归并:
①将G的每条不可扩展路的结点及其该结点所在G的强分图归并;
②将完成①之后的未处理结点按其所在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]}的最短路径长度矩阵Di。
③若Di中除主对角线元素外具有Max元,则边[i,j]是割边,否则边[i,j]不是割边。
图G=<
V,E,W>
的邻接矩阵A按下面方式定义:
设S表示已找到从v0出发的最短路径的终点的集合,向量D的每个分量D[i]表示从始点v0到每个终点vi的最短路径的长度,Succ(u)表示u的后继结点组成的集合。
求结点0到其它各结点的所有最短路径的算法描述如下:
①初始化S及D。
S={0},D[i]=A[0,i],i=0,1,…,n-1。
②选取j,使得D[j]=min{D[i]|i∈V-S},令S=S∪{j}。
③修改从0出发到集合V-S上任一结点k可达的最短路径长度。
如果D[j]+A[j][k]<
D[k]则修改D[k]为:
D[k]=D[j]+A[j][k]。
④重复操作②、③共n-1次,求得从0到其余各结点j的最短路径长度D[j]。
⑤按如下方法构造矩阵P:
⑥根据矩阵P输出所有最短路径。
方法是:
按照公式Succ(u)={w|P[u][w]=D[w]且u≠w}求出每个顶点的后继结点组成的集合;
根据求得的结果按秩的大小输出从源点到其他各顶点的所有最短路径。
设向量D的每个分量D[i]表示当前所找到的从源点0到每个终点i的路径的最大长度;
向量S的每个分量S[i]表示从源点0到终点i的最长距离是否已求出,若已求出则S[i]=1,否则S[i]=0;
P为按照下述方法对A进行修正后得到的矩阵;
Pre(u)表示u的前驱结点组成的集合。
则求源点0到汇点n-1的所有关键路径的算法描述如下:
①初始化矩阵S、D和P
for(i=0;
i<
n;
i++)S[i]=0;
S[0]=1;
i++)D[i]=A[0][i];
P=A;
②选择k,使得D[k]=max{D[i]|S[i]=0},并令S[k]=1。
用D[k]修正矩阵P第k+1行的值,即:
若P[k][i]不等于0,则P[k][i]=P[k][i]+D[k],否则P[k][i]的值不变,i=0,1,…,n-1。
③根据矩阵P第k+1行的值修正D的值,即:
若D[i]<
P[k][i],则D[i]=P[k][i]且S[i]=0,否则D[i]的值不变,i=0,1,…,n-1。
④判断该过程是否结束,若结束则转向⑤,否则转向②。
⑤根据矩阵P输出所有关键路径。
按照下面公式求出每个顶点的前驱结点组成的集合Pre(u)={w|P[w][u]=D[u]且u≠w},根据求得的结果输出从源点到汇点的所有关键路径。
设G=<
是n阶m条边的连通无向带权图。
Kruskal算法如下:
①在G中选取最小权边e1,并置边数i=1。
②当i=n-1时结束,否则转向③。
③设已选择的边为e1,e2,…,ei,在G中选取不同于e1,e2,…,ei的边ei+1,使得ei+1是满足与e1,e2,…,ei不构成回路且权值最小的边。
④置i为i+1,转向②。
Prim算法如下:
①在G中任意选取一结点v1,并置U={v1},置最小生成树的边集TE={}。
②在所有u∈U,v∈V-U的边[u,v]∈E中,选取权值最小的边[u,v],将[u,v]并入TE,同时将v并入U。
③重复②直到U=V为止。
(9)求Huffman编码(最优二叉树对应的前缀码)
//―――――最优二叉树的存储结构
typedefstruct{
intweight;
//结点的权值
intparent;
//指向其双亲结点
charchild;
//表示该结点是其双亲结点的左或右孩子结点
}Node,*huffmantree;
//―――――Huffman编码的存储结构
typedefstructnode{
chardata;
structnode*next;
}node,*huffmancode;
假定n个叶子结点的所带权值为{1,2,…,n},求其对应最优二叉树的赫夫曼编码的算法如下:
(1)构造最优二叉树
①根据给定的n个权值{1,2,…,n}构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为i的根结点,其左右子树为空。
②在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
③在F中删除这两棵树,同时将新得到的二叉树加入F中。
④重复②和③,直到F只含一棵树为止。
(2)在得到最优二叉树之后,从每个叶子结点出发走一条从叶子到根的路径即可得到该叶子结点字符对应的Huffman编码。
①i=0。
②求从i出发的所有不可扩展的基本路,若存在长度为n的基本路且形成回路,则该图为哈密尔顿图,结束。
③i=i+1。
若i=n-1,该图不是哈密尔顿图,结束。
否则,转向②。
设二部图G=<
V1,V2,E>
,其中V1={u0,u1,…,un-1},V2={v0,v1,…,vm-1},则二部图G可用n×
m阶矩阵A=(aij)表示,其中
定义一个全局变量B[n]来存储求出的一个完备匹配,其初值元素全为-1。
根据二部图完备匹配的定义可知,若B是二部图G的一个匹配,则向B中添加边,并保证B仍然是一个匹配,直到不能再添加边为止,若B中边数为n,则B一定是二部图G的一个完备匹配。
因此,求G的完备匹配的过程实际上是从矩阵A的不同行、不同列选取元素为1的极大元组。
该算法采用搜索、试探、前进、回溯等几种运算来实现。
实验9
设计一个状态输出自动机M,对于输入的一个二进制x,M输出x被3除的余数,并在计算机上实现;
自动机理论是离散数学在计算机科学中的重要应用。
通过该组实验,目的是让学生更加深刻地理解自动机的相关概念,并能通过程序实现自动机的构造。
由于输出是输入二进制数
的模3数,而与具体的输入数无关,所以输入字母集是{0,1}。
而输出字母集R={0,1,2}。
要求机器能“记住”输入二进制数的模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为一致校验矩阵,YMB[0]为群码,E为左陪集的代表元,YMB为译码表。
C、E和YMB中每个元素分别存放其二进制数对应的十进制数。
求一个接受字的发送字的算法描述如下:
(1)输入n、m和H。
(2)根据H求得群码YMB[0]。
(3)求
,其中1恰在第i位,i=1,2,……,n.。
(3)构造译码表。
①求群码YMB[0]的所有左陪集:
YMB[0],E[1]YMB[0],E[2]YMB[0],……,E[n]YMB[0]。
②如果
,取一个不在①中左陪集的字z,依次类推,直到
个左陪集构造完毕。
(4)输入接受字,并根据译码表求出其发送字。