离散数学关系的闭包运算
离散数学如何求r的传递闭包
离散数学如何求r的传递闭包离散数学的传递闭包是指在一个关系 R 上,通过不断地迭代是否存在一些元素关系可以联通,扩展出一个新的关系闭包集合,使得 R 中任何两个元素之间都存在一条路径。
其中,R 是原始关系,而 R 的传递闭包是所有可以从 R 中的元素得到的路径的集合。
传递闭包是在关系上的一个重要属性,因为它可以表示元素之间的隐含关系,从而有助于更详细地分析和描述数据。
计算 R 的传递闭包有多种方法,其中最经典的是 Warshall 算法。
下面是使用Warshall 算法计算 R 的传递闭包的步骤。
1)建立一个大小为n × n 的布尔矩阵 T,其中 T[i][j] 表示从 i 到 j 是否存在一条路径。
2)将布尔矩阵 T 的初始值设置为 R 的布尔矩阵。
3)进行 n 次迭代,每次迭代更新布尔矩阵 T 的值。
具体地,对于 T 中的每一个元素 T[i][j],如果存在一个 k 使得 T[i][k] 和 T[k][j] 均为 true,则将 T[i][j] 设为 true。
4)最终的 T 就是 R 的传递闭包。
下面是 Warshall 算法的详细代码实现:```int[][] transitiveClosure(int[][] R) {int n = R.length;int[][] T = new int[n][n];// 初始化 T 为 R 的布尔矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (R[i][j] == 1) {T[i][j] = 1;}}}// 根据 Warshall 算法进行迭代for (int k = 0; k < n; k++) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {T[i][j] |= (T[i][k] & T[k][j]);}}}return T;}```该算法的时间复杂度为 O(n^3),其中 n 是 R 的大小。
离散数学传递闭包求法
离散数学传递闭包求法一、引言离散数学是计算机科学中的重要分支,它研究离散对象及其关系的数学理论。
其中,传递闭包是离散数学中的一个重要概念,它在图论、关系代数等领域有着广泛的应用。
本文将介绍传递闭包的求法,以及其在实际应用中的作用。
二、传递闭包的定义传递闭包是指在一个关系上,若存在从一个元素到另一个元素的路径,则这两个元素之间存在传递关系。
传递闭包就是将这些传递关系全部加入到原有关系中所得到的新关系。
例如,若关系R={(1,2),(2,3)},则其传递闭包为R*={(1,2),(2,3),(1,3)}。
三、传递闭包的求法1. Warshall算法Warshall算法是一种经典的传递闭包求法,其基本思想是利用矩阵乘法的性质,通过多次迭代来求得传递闭包。
具体步骤如下:(1)初始化矩阵T为原有关系矩阵R;(2)对于矩阵T中的每一个元素T[i][j],若存在T[i][k]和T[k][j]均为1,则将T[i][j]置为1;(3)重复执行步骤(2),直到矩阵T不再发生变化。
最终得到的矩阵T即为原有关系R的传递闭包。
2. Floyd算法Floyd算法也是一种常用的传递闭包求法,其基本思想是通过多次迭代来求得传递闭包。
具体步骤如下:(1)初始化矩阵T为原有关系矩阵R;(2)对于矩阵T中的每一个元素T[i][j],若存在T[i][k]和T[k][j]均为1,则将T[i][j]置为1;(3)重复执行步骤(2),直到矩阵T不再发生变化。
最终得到的矩阵T即为原有关系R的传递闭包。
四、传递闭包的应用传递闭包在实际应用中有着广泛的应用,例如:1. 图论中的可达性分析:通过求解传递闭包,可以判断图中任意两个节点之间是否存在路径,从而进行可达性分析。
2. 关系代数中的等价类划分:通过求解传递闭包,可以将原有关系划分为若干个等价类,从而进行等价类划分。
3. 数据库中的关系查询:通过求解传递闭包,可以进行关系查询,例如查询某个节点的所有后继节点。
闭包运算的实验报告
一、实验目的1. 理解闭包运算的概念及其在离散数学中的应用。
2. 掌握关系闭包运算(自反闭包、对称闭包、传递闭包)的求解方法。
3. 利用编程语言实现关系闭包运算,并分析实验结果。
二、实验内容1. 自反闭包运算:给定一个关系R,求出R的自反闭包R^。
2. 对称闭包运算:给定一个关系R,求出R的对称闭包R^s。
3. 传递闭包运算:给定一个关系R,求出R的传递闭包R^t。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm四、实验步骤1. 定义关系R:以矩阵形式表示关系R,其中R[i][j]表示元素i和元素j之间的关系,1表示存在关系,0表示不存在关系。
2. 求自反闭包R^:a. 初始化一个与R同样大小的矩阵R^。
b. 遍历R^,对于每个元素R^[i][j],若R[i][j]=1或i=j,则R^[i][j]=1。
3. 求对称闭包R^s:a. 初始化一个与R同样大小的矩阵R^s。
b. 遍历R,对于每个元素R[i][j],若R[i][j]=1,则R^[i][j]=1且R^[j][i]=1。
c. 遍历R^s,对于每个元素R^[i][j],若R^[i][j]=1,则R^[j][i]=1。
4. 求传递闭包R^t:a. 初始化一个与R同样大小的矩阵R^t。
b. 遍历R,对于每个元素R[i][j],若R[i][j]=1,则R^[i][j]=1。
c. 循环执行以下步骤,直到R^t不再变化:i. 遍历R^t,对于每个元素R^[i][j],若R^[i][k]=1且R^[k][j]=1,则R^[i][j]=1。
五、实验结果与分析1. 自反闭包运算:给定关系R如下:0 1 01 0 10 1 0求自反闭包R^,结果如下:1 1 11 1 11 1 12. 对称闭包运算:给定关系R如下:0 1 01 0 10 1 0求对称闭包R^s,结果如下:1 1 11 1 11 1 13. 传递闭包运算:给定关系R如下:0 1 01 0 10 1 0求传递闭包R^t,结果如下:1 1 11 1 11 1 1通过实验,我们可以发现:1. 自反闭包运算使得关系R中的所有元素都与自身存在关系。
离散数学3.7-8
复合关系和逆关系
S1=S, {<a,c>,<b,d>,<c,e>,<d,f>}, S2=SοS={<a,c>,<b,d>,<c,e>,<d,f>}, {<a,d>,<b,e>,<c,f>}, S3=SοSοS=S2οS={<a,d>,<b,e>,<c,f>}, {<a,e>,<b,f>}, S4=S3οS={<a,e>,<b,f>}, S5=S4οS={<a,f>}, {<a,f>}, S 6 = S 5 ο S =Φ , S 7=Φ, …, , (n>5). Sn=Φ (n>5).
20
关系的闭包运算
首先R 是自反的, 证:1. 首先 ∪ IA是自反的,且R R ∪ IA, 若又有自反关系R'满足 若又有自反关系 满足R R',则因为 满足 ,则因为R' 是自反的有I 是自反的有 A R',即有 R' ∧ IA R', ,即有R , 从而有R ∪ IA R',命题得证. 从而有 ,命题得证.
19
关系的闭包运算
下面介绍由给定关系R,求其各种闭包的方法. 下面介绍由给定关系R,求其各种闭包的方法. R,求其各种闭包的方法
定理 设R是集合A上的二元关系,则: 是集合A上的二元关系, r(R)= 1. r(R)=R∪IA. s(R)= 2. s(R)=R∪RC. 3. t(R)=t(R) = R ∪ R2 ∪ R3 ∪ .... t(R)= .
8
复合关系和逆关系
关系的闭包运算 离散数学
(1)传递闭包的性质
R是传递的,当且仅当 t(R) =R
(2) 构造传递闭包的方法
设R是集合X上的二元关系,则t(R)=
证R∪明R:2∪(1R)3∪∪i∞=1…Ri t(R) 用数学归纳法 1) i=1时,根据传递闭包的定义R t(R)
=
∞
∪
Ri
i=1
2)假设i≥1时,Ri t(R),从而对i+1时, 设<x,y>∈Ri+1 ,∵Ri+1=Ri 。R,则存在某个元 素c,使得<x,c>∈Ri,<c,y>∈R,由归纳假设 有<x,c>∈t(R),<c,y>∈t(R),
S2={<a,c>,<b,d>} S3={<a,d>} S4=, ∴ t(S)=S ∪ S2 ∪ S3
={<a,b>, <a,c>,<a,d>,<b,c>,<b,d>,<c,d>}
闭包的性质
设R1和R2是集合A上的关系且R1 ⊇ R2,则 a)r(R1) ⊇ r(R2) b)s(R1) ⊇ s(R2) b)t(R1) ⊇ t(R2) 定理* 设R是集合X上的二元关系,则
t(R)= R∪R2∪R3∪…∪Rk
分析:只要能够证明出t(R) R∪R2∪R3∪…∪Rk
证明:对x,y∈X,设<x,y>∈t(R),则必存在最小正整 数k,使得<x,y>∈Rk,现证明k≤n。
若k>n,则存在结点序列x=a0,a1,a2 ,… ,ak-1,ak=y, 使得xRa1 , a1Ra2 ,… ,ak-1Ry。 因为k>n,则a0,a1,… ,ak中必有相同者, 不妨设ai = aj ,0 ≤i<j≤k, 于是xRa1 , a1Ra2 ,… ,ai-1Rai ,ajRaj+1 ,… ,ak-1Ry成立。 即<x,y>∈Rs ,这里s=k-(j-i)<k,这与k是最小的假设 相矛盾,于是k≤n,又<x,y>是任意的,故定理成立。
离散数学第讲2
(3)设R2是任何一个关系,且有RR2A×A,R2是传递的。 对任意<a,b>∈R1,存在Rj(1≤j<),使得<a,b>∈Rj,
所以存在c1,c2,c3,…,cj-1∈A,使得:
2022/10/25
计算机学院
7
<a,c1>∈R,<c1,c2>∈R,<c2,c3>∈R,....,<cj-1,b>∈R。 因RR2,所以 <a,c1>∈R2,<c1,c2>∈R2,<c2,c3>∈R2,…,<cj-1,b>∈R2。 由R2是传递的,有: <a,c2>∈R2,<c2,c3>∈R2,<c3,c4>∈R2,…,<cj-1,b>∈R2。 一直下去,最终有:<a,b>∈R2。 所以,R1R2。
由归纳法知,对任意有的i∈N+,有Ri t(R)。
R1,所以
1) r(R)={<a,b>,<b,b>,<b,c>,<a,a>,<c,c>}; (2) 对任意a,b,c∈A,若<a,b>∈R1,<b,c>∈R1,
j:=j+1; j=2,A的第二列有两个1,即A(1,2)=A(3,2)=1
1)r(R1) r(R2)
3)集合A上的关系的对称传递闭包定义为st(R) =s(t(R)) 同上,我们还可定义sr(R),tr(R),ts(R),…
定理4.9 设R是集合A上的关系,则:
1)rs(R)=sr(R)
2)rt(R)=tr(R)
3)st(R)ts(R)
2022/10/25
离散数学闭包求法
离散数学闭包求法一、闭包的概念在离散数学中,闭包是指从一个给定的集合中生成一个更大的集合的过程。
闭包的目的是为了将原始集合中的元素与其他元素进行组合,以生成一个包含所有可能组合的新集合。
闭包操作可以用来补充原始集合中缺失的元素,或者生成满足某种条件的元素。
二、闭包的分类根据不同的应用领域和问题要求,闭包可以分为几种不同的类型,包括传递闭包、反对称闭包、自反闭包等。
1. 传递闭包:传递闭包是指在一个关系集合中,通过迭代地应用传递规则,生成一个包含所有相关元素的新集合。
传递闭包可以帮助我们分析集合之间的关系,例如在图论中,通过计算传递闭包可以确定两个节点之间是否存在路径。
2. 反对称闭包:反对称闭包是指在一个关系集合中,通过添加一些额外的元素,使得原始关系对称的元素对被移除。
反对称闭包可以帮助我们分析集合中的对称关系,例如在关系代数中,通过计算反对称闭包可以确定两个元素是否存在对称关系。
3. 自反闭包:自反闭包是指在一个关系集合中,通过添加一些额外的元素,使得原始关系中所有元素都与自身存在关系。
自反闭包可以帮助我们分析集合中的自反关系,例如在关系代数中,通过计算自反闭包可以确定一个元素是否与自身存在某种关系。
三、闭包的求解方法根据不同的闭包类型,可以使用不同的求解方法来计算闭包。
下面将介绍几种常见的求解方法。
1. 传递闭包的求解方法:传递闭包可以通过迭代地应用传递规则来计算。
具体步骤如下:(1)初始化闭包集合为原始关系集合。
(2)重复以下步骤,直到闭包集合不再变化:a. 对于每对元素(a, b)和(b, c),如果(a, c)不在闭包集合中,则将(a, c)添加到闭包集合中。
(3)输出闭包集合。
2. 反对称闭包的求解方法:反对称闭包可以通过移除对称的元素对来计算。
具体步骤如下:(1)初始化闭包集合为原始关系集合。
(2)对于每对元素(a, b),如果(b, a)也在闭包集合中,则将(b, a)从闭包集合中移除。
离散数学关系的闭包
例 15
例15 设A={a,b,c,d},R={<a,b>,<b,a>,<b,c>,<c,d>, <d,b>},则R和r(R),s(R),t(R)的关系图如下图所示。其 中r(R),s(R),t(R)的关系图就是使用上述方法直接从R的 关系图得到的。
c
a
b
d
c
a
b
d
c
a
b
d
c
a
b
d
Warshall 算法
③设R″是包含R的对称关系, 任取<x,y>,有 <x,y>∈R∪R-1 <x,y>∈R∨<x,y>∈R-1 <x,y>∈R∨<y,x>∈R <x,y>∈R″∨<y,x>∈R″ <x,y>∈R″∨<x,y>∈R″ <x,y>∈R″ 所以 R∪R-1 R″.
定理10 (3)的证明
(3)t(R)=R∪R2∪R3∪… 证明 先证R∪R2∪… t(R)成立,为此只需证对任意的正整数n有 Rn
定理10 (3)的证明
(3)t(R)=R∪R2∪R3∪… 证明 要证t(R)R∪R2∪…成立,只须证明R∪R2∪…是传递的。
任取<x,y>,<y,z>,则 <x,y>∈R∪R2∪… ∧ <y,z>∈R∪R2∪…
t(<x,y>∈Rt) ∧ s(<y,z>∈Rs) ts(<x,y>∈Rt ∧ <y,z>∈Rs) ts(<x,z>∈Rt Rs) ts(<x,z>∈Rt+s) <x,z>∈R∪R2∪… 从而证明了R∪R2∪…是传递的。
离散数学W15L1C4-4.3-4关系的性质与闭包
(Rm)n+1=(Rm)n∘Rm=(Rmn)∘Rm=Rmn+m=Rm(n+1) 所以对一切 m,n∈N 有 (Rm)n=Rmn.
6
4.3 关系的性质
自反性 反自反性 对称性 反对称性 传递性
7
自反性与反自反性
定义 设R为A上的关系, (1) 若x(x∈A→<x,x>R), 则称R在A上是自反的. (2) 若x(x∈A→<x,x>R), 则称R在A上是反自反的.
R1 对称、反对称. R2 对称,不反对称. R3 反对称,不对称. R4 不对称、也不反对称.
11
传递性
定义 设R为A上的关系, 若 xyz(x,y,z∈A∧<x,y>∈R∧<y,z>∈R→<x,z>∈R), 则称R是A上的传递关系.
实例: A上的全域关系EA,恒等关系IA和空关系 小于等于关系, 小于关系,整除关系,包含关系, 真包含关系
证 用归纳法 (1) 对于任意给定的m∈N, 施归纳于n.
若n=0, 则有 Rm∘R0=Rm∘IA=Rm=Rm+0
假设Rm∘Rn=Rm+n, 则有 Rm∘Rn+1=Rm∘(Rn∘R)=(Rm∘Rn)∘R=Rm+n+1 ,
所以对一切m, n∈N有Rm∘Rn=Rm+n.
5
幂运算的性质(续)
(接上页证明) (2) 对于任意给定的 m∈N, 施归纳于n. 若n=0, 则有
关系
反对称关系:恒等关系IA,空关系是A上的反对
称关系. 10
实例
例2 设A={1,2,3}, R1, R2, R3和R4都是A上的关系, 其中 R1={<1,1>,<2,2>}, R2={<1,1>,<1,2>,<2,1>} R3={<1,2>,<1,3>}, R4={<1,2>,<2,1>,<1,3>}
离散(关系的运算)
t ( R ) R i =R∪R2∪R3
i 1
={<a,b>,<b,c>,<c,a>,<a,c>,<b,a>,<c,b>,<a,a>,<b,b>,<c,c> }
定理3.8.5 设A是含有n个元素的集合, R是 A上的二元关系,
则存在一个正整数k≤n,使得
t(R)=R∪R2∪R3∪…∪Rk
n
wij ( rik skj )
k 1
式中∧代表逻辑乘,满足0∧0=0 , 0∧1=0, 1∧0=0, 1∧1=1. ∨代表逻辑加,满足0∨0=0 , 0∨1=1, 1∨0=1, 1∨1=1.
例4. 设集合A={ 1, 2, 3, 4 }, B={ 2, 3, 4}, C={ 1, 2, 3 }
离散数学(Discrete Mathematics)
3-7 关系的运算
一、 复合关系 (Compound Relations)
定义3.7.1 设 R 是由X 到Y 的关系, S 是由Y 到Z 的关系, 则 RS 称为R 和 S 复合关系, 表示为 RS ={ <x,z> | xX∧zZ∧(y)(yY∧xRy∧ySz) } 两个关系的合成运算可以推广到多个. 例如: RSP、 R S P Q 等. 且合成运算满足结合律.即: ( P R )Q= P( RQ ) 关系R自身合成n次可以记为: RR ‥‥R=R(n)
1 0 0
RS={< 1, 1 >, < 2,1 >, < 2, 3 > ,< 3, 2 >,<4,1> }
离散数学33.关系的闭包
b) s(R2) s(R1); c) t(R2) t(R1).
二、闭包的构造方法
1、定理 3-8.2-8.4 设R是X上的二元关系,那么 a) r(R)=R∪IX; b) s(R)= R∪Rc; c) t(R)= R∪R(2)∪R(3) ∪…
a) 证:设R = R∪IX • ∵ ① xX,<x,x>R∴R具有自反性.
R的自反闭包r(R)-----Reflexive Closure 对称闭包s(R)-----Symmetric Closure 传递闭包t(R)-----Transitive Closure
用扩充序偶的方法得到自反(对称)闭包 例如, 设A={a,b,c,d},R={<a,b>, <b,a>, <b,c>, <c,d>, <d,b>},则 r(R) = {<a,b>, <b,a>, <b,c>, <c,d>, <d,b> , <a,a><b,b>,<c,c>, <d,d> } s(R) = {<a,b>, <b,a>, <b,c>, <c,d>, <d,b>,<c,b>, <d,c>, <b,d>}
事实上,由于<x, y> R(n+1) = R(n) R (t)(<x,t> R(n) ∧<t,y>R) (t)(<x,t>t(R) ∧<t,y>t(R))
<x,y>t(R) 从而 R(n+1) t(R) .
离散数学关系的闭包运算
《离散数学》实验报告学院软件学院专业软件工程指导教师邹丽娜学号10008118姓名冯立勇提交日期2011-12-25实验二关系的闭包运算一 、实验目的熟悉关系的闭包运算,编程实现关系闭包运算算法。
一 、实验内容利用矩阵求解有限集上给定关系的自反、对称和传递闭包。
三. 实验过程1. 算法分析:在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为1就可;对称闭包则加上关系的转置矩阵(逻辑加法);传递闭包则有两种算法(二选一即可):算法1:直接根据 n i i RR t 1)(==计算,过程略。
算法2:Warshall 算法(1962)设R 的关系矩阵为M(1)令矩阵A=M(2)置i=1(3)对所有的j ,若A[j ,i]=1,则对于 k=1,2,…,n ,令A[j ,k]=A[j ,k]+A[i ,k]注:此处为逻辑加,可以使用运算符||(4) i=i+l .(5)若i ≤n ,则转到(3),否则结束.流程图开始声明各子函数输入关系矩阵输入zz=1;调用自反闭包函数 z=2,调用对称闭包函数 z=3调用传递闭包函数2. 程序代码:#include<stdio.h>void output(int s[][100]);void zifan(int s2[][100]);void duichen(int s2[][100]);void chuandi2(int s2[][100]);void chuandi1(int s2[][100]);void aa();int s[100][100],z;int d,n ,i,j;int main(){aa();return 0;}void aa(){printf("请输入矩阵的行数(必须小于10)\n ");scanf("%d",&n);printf("请输入矩阵的列数(必须小于10)\n ");scanf("%d",&d);printf("请输入关系矩阵\n");for(i=0;i<n;i++){ printf("\n");printf("请输入矩阵的第%d行元素",i);for(j=0;j<d;j++)scanf("%d",&s[i][j]);}printf("输入对应序号选择算法\n1:自反闭包\n2:传递闭包1\n3:传递闭包(Warhall算法)2\n4:对称闭包\n");scanf("%d",&z);switch(z){case 1:zifan(s); break;case 2:chuandi1(s);break;case 3:chuandi2(s);break;case 4:duichen(s); break;}}void output(int s[][100]){printf("所求关系矩阵为\n"); for(i=0;i<n;i++){for(j=0;j<d;j++)printf("%d",s[i][j]);printf("\n");}}void zifan(int s2[][100]){for(i=0;i<n;i++)s2[i][i]=1;output(s2);aa();}void duichen(int s2[][100]){int s1[100][100];for(i=0;i<n;i++)for(j=0;j<d;j++)s1[j][i]=s2[i][j];for(i=0;i<n;i++)for(j=0;j<d;j++){s2[i][j]=s2[i][j]+s1[i][j];if(s2[i][j]>1)s2[i][j]=1;}output(s2);aa();}void chuandi1(int s2[][100]) {int m[100][100],a[100][100],k,h; int t[100][100];for(i=0;i<n;i++)for(j=0;j<d;j++){ a[i][j]=0;t[i][j]=s2[i][j];m[i][j]=s2[i][j];}for(h=0;h<n;h++){for(i=0;i<n;i++)for(j=0;j<d;j++)if(m[i][j]==1){for(k=0;k<n;k++)if(s2[j][k]==1)a[i][k]=1;}for(i=0;i<n;i++)for(j=0;j<d;j++){ m[i][j]=a[i][j];t[i][j]+=a[i][j];a[i][j]=0;if(t[i][j]>1)t[i][j]=1;}}output(t);aa();}void chuandi2(int s2[][100]) {int k;for(i=0;i<n;i++)for(j=0;j<n;j++)if(s2[j][i]==1)for(k=0;k<n;k++) s2[j][k]+=s2[i][k];for(i=0;i<n;i++)for(j=0;j<n;j++)if(s2[i][j]>1)s2[i][j]=1;output(s2);aa();}3.实验数据及结果分析。
离散数学第三章第三节
3、闭包的概念
关系可以具有自反、对称、传递等性质。然而,不是所有的关 系都具有这些性质。但通过对给定的关系添加新的元素(有序 对),所得的关系将具有这些性质。当然,在对给定的关系进行 扩充时,一方面要使扩充后的关系具有某些性质;另一方面,又 不想添加过多的元素,做到恰到好处,即添加的元素要最少。 对给定的关系用扩充元素的方法得出具有某些性质的新关系叫 闭包运算。
11
4、构造闭包(续1)
定理5(2)的证明。
定理5 设R是A上的关系,则 (2) s(R)=RRC
证:设R'= RRC,显然R RRC(=R')
任取<x,y>RRC <x,y>R<x,y>RC <y,x>RC<y,x>R <y,x>RRC 所以R'是对称的。 设R"是对称的且RR"。 任取<x,y>R'<x,y>R<x,y>RC <x,y>R"<y,x>R (因RR") <x,y>R"<y,x>R" (因RR") <x,y>R"<x,y>R" (因R"是对称的) <x,y>R" 故R'R"
16
第3-3讲 作业
P119
5 P127 1,2a
17
12
4、构造闭包(续2)
定理5(3)的证明。
定理5 设R是A上的关系,则 (3) t(R)=RR2R3… 证:先证RR2R3… t(R),只须证明对任意正整数n均有
Rnt(R)即可。用归纳法证明。 n=1时,R1=R ,R t(R)。 假设Rn t(R),则对 任意<x,y>Rn+1 <x,y> RnR t(<x,t>Rn<t,y>R) t(<x,t> t(R)<t,y> t(R)) <x,y> t(R) (因t(R)是传递的) 从而命题得证。 再证 t(R) RR2R3…。为此,只需证 RR2R3…是传递的, 因为t(R)是包含R的最小传递闭包。 任意<x,y>RR2R3… <y,z>RR2R3… s(<x,y>Rs) t(<y,z>Rt) st(<x,y>Rs<y,z>Rt) st(<x,y>RsRt) <x,y> RR2R3… 这说明RR2R3…是传递的。
离散数学实验 C 关系的运算 幂运算 闭包运算
实验2关系的运算(1)关系的幂运算输入:集合A,二元关系集合R,幂次n输出:R的n次幂要求:尽量使运算的计算量最小(2)关系闭包的计算输入:集合A,二元关系集合R输出:R的传递闭包t(R)要求:(a)采用Warshall算法(89页)(b)编写代码判断输出t(R)为传递闭包程序代码:#include<iostream>#include<sstream>#include<vector>usingnamespacestd;typedefvector<vector<int>>Mat;classRelation{vector<int>s;//集合MatA;//关系矩阵MatB;MatC;MatE;MatD[100];//用来存储矩阵intn;public:voidinputs();//将集合存入向量中voidinputa();//将读入的关系转化为关系矩阵voidprint();//输出关系矩阵voidmi();intWarshall();};//定义类intn,m;//全局变量,下文中使用voidRelation::inputs(){cout<<"输入集合";for(inta;cin>>a;){s.push_back(a);if(getchar()=='\n')break;}}//将集合存入向量中voidRelation::inputa(){//将读入的关系转化为关系矩阵 cout<<"输入关系";inti,j,e,r;for(i=0;i<s.size();i++){vector<int>u;for(j=0;j<s.size();j++){intia=0;u.push_back(ia);}A.push_back(u);B.push_back(u);C.push_back(u);E.push_back(u);}//创建二维向量,初始化,是每个元素为0for(inth,z;cin>>h>>z;){if(h==0&&z==0)break;for(i=0;i<s.size();i++){if(s[i]==h)e=i;if(s[i]==z)r=i;}A[e][r]=1;B[e][r]=1;E[e][r]=1;//C[e][r]=1;//读入关系,将关系对应的矩阵中的位置元素变为1if(getchar()=='\n')break;}voidRelation::print(){for(inti=0;i<s.size();i++){for(intj=0;j<s.size();j++)cout<<A[i][j]<<"";cout<<endl;}}//输出关系矩阵voidRelation::mi(){inta,b,i,c;cin>>n;//读入幂次if(n==0){//0次幂for(intk=0;k<s.size();++k){for(intj=0;j<s.size();++j){if(k==j)cout<<"1";//对角线上元素为1 elsecout<<"0";}cout<<endl;}else{for(i=1;i<n;++i){for(inth=0;h<s.size();++h){for(intd=0;d<s.size();++d){intm=0;for(intx=0;x<s.size();++x){m=m+B[h][x]*A[x][d];//第h行第d列的元素对应相乘的和}C[h][d]=m;}}if(i>1){for(a=0;a<s.size();++a){for(b=0;b<s.size();++b){if(C[a][b]!=D[0][a][b])break;}if(b!=s.size())break;}}//检验是否重复if(a==s.size()&&b==s.size()){break;//重复则跳出不再幂乘}for(intk=0;k<s.size();k++){for(intj=0;j<s.size();j++){B[k][j]=C[k][j];}D[i-1]=B;c=i;}}if(a==s.size()&&b==s.size()){intq;q=(n-i)%c;//找出结果位置if(q==0)q=c;for(inte=0;e<s.size();e++){for(intf=0;f<s.size();f++){cout<<D[q-1][e][f]<<"";//输出}cout<<endl;}return;}else{//1次幂for(inth=0;h<s.size();h++){for(intn=0;n<s.size();n++){cout<<B[h][n]<<"";}cout<<endl;}}}}intRelation::Warshall(){for(inti=0;i<s.size();++i){for(intj=0;j<s.size();++j){if(A[j][i]==1){for(intk=0;k<s.size();++k){A[j][k]=A[j][k]+A[i][k];if(A[j][k]!=0&&A[j][k]!=1)A[j][k]=1;}}}}print();inta=1;intb=1;//for(intp=0;p<s.size();++p){for(intl=0;l<s.size();++l){if(A[p][l]==0){for(intx=0;x<s.size();++x){if(A[p][x]*A[x][l]==1)a=0;}}}}if(a==0){cout<<"wrong!"<<endl;}else{for(intp=0;p<s.size();++p){for(intl=0;l<s.size();++l){if(A[p][l]==1&&E[p][l]==0){A[p][l]=0;//再判断传递性for(intp=0;p<s.size();++p){for(intl=0;l<s.size();++l){if(A[p][l]==0){for(intx=0;x<s.size();++x){if(A[p][x]*A[x][l]==1)b=0;}}}}if(b==1){cout<<"wrong!"<<endl;return0;}A[p][l]=1;}}}cout<<"right!"<<endl;}//return1;}voidmain(){Relationw;w.inputs();w.inputa();w.print();cout<<"输入n"<<endl; w.mi();cout<<endl;cout<<"闭包为"<<endl; w.Warshall();}实验截图:。
warshall算法求传递闭包离散数学
warshall算法求传递闭包离散数学Warshall算法是一种用于求解传递闭包的经典算法,在离散数学中非常常见和重要。
传递闭包是一个二元关系的重要概念,给定一个关系R,传递闭包就是一个关系R+,它包含由R导出的所有传递关系,也就是如果存在元素a和元素b,且有一个序列元素a=r_1,r_2,...,r_k=b,其中r_1,r_2,...,r_k属于R,那么就有a R+ b。
换句话说,传递闭包包含了R中的所有传递关系。
Warshall算法可以用来求解关系的传递闭包。
这个算法的基本思想是以动态规划的方式逐步计算关系的传递闭包。
具体步骤如下:
1. 初始化一个n×n矩阵T,其中n是关系的元素个数。
如果关系中的元素i和元素j之间有关系R,则T[i][j]=1,否则T[i][j]=0。
2. 对于矩阵T中的每一对不同的元素i和j,检查是否存在第三个元素k,使得T[i][k]=1且T[k][j]=1。
如果存在,则将T[i][j]设为1,代表元素i和元素j之间存在传递关系。
如果不存在,则保持T[i][j]的原始值。
3. 重复步骤2,直到矩阵T不再变化为止。
此时,矩阵T即为原始关系的传递闭包。
通过Warshall算法,可以高效地求解关系的传递闭包。
该算法的时间复杂度为O(n^3),其中n为关系的元素个数。
需要注意的是,Warshall算法要求关系R的元素是有限离散的,而且关系的元素个数不能太大,否则算法的计算时间会非常长。
离散数学-关系的闭包
Warshall算法
9 / 68
设A={x1,x2,…,xn},R为A上的二元关系,R的关系矩阵为M:
1. Mt = M+M2+…+Mn 2. Warshall算法 考虑矩阵序列 M0,M1,…,Mn= Mt : k=0,1,…,n Mk[i,j]=1 当且仅当 在GR中存在一条从xi到xj的路径 并且除端点外中间只经过{x1,x2,…,xk}中的顶点. Mk+1[i,j]=1 当且仅当 在GR中存在一条从xi到xj的路 径并且除端点外中间只经过{x1,x2,…,xk,xk+1}中的顶 点 Mk[i,j]=1 或者 Mk[i,k+1]=1 ∧ Mk[k+1,j]=1
离散数学
集合论
主要内容
集合代数
集合的基本概念 集合的运算 有穷集合的计数 集合恒等式
2 / 68
二元关系
有序对与笛卡儿积 二元关系 关系的运算 关系的性质 关系的闭包 等价关系与划分 偏序关系
函数的定义与性质 函数的复合与反函数 双射函数与集合的基数
函数
§7.5 关系的闭包
一. 闭包的定义
现在来证 t(R)的对称性.由于 <x,y>t(R) n(<x,y>Rn) n(<y,x>Rn) <y,x>t(R)
因此t(R)是对称的.
注:由于对称闭包运算不保持传递性,故在运算顺序 上它应放在传递闭包之前,即 t s r(R)=t(s(r(R))).
注
二元关系的闭包仍然是二元关系,还可以求d}, R={<a,b>,<b,a>,<b,c>,<c,d>},求
10 / 68
北大离散数学第7讲关系幂运算与关系闭包
关系的n次幂
关系的n次幂(nth power): 设RAA, nN, 则
(1) R0 = IA; (2) Rn+1 = Rn○R, (n1).
Rn RRR
n个R
Rn表示的关系, 是R的关系图中长度为n的 有向路径的起点与终点的关系.
1
2
n-1
Байду номын сангаас
n
第二页第,二共页50页。
又名抽屉原则(Dirichlet drawer principle),
(Peter Gustav Lejeune Dirichlet,1805~1859)
推广形式: 若把m件物品装进k只抽屉, 则
至少有一只抽屉装
m k
只以上的物品.
1.8=2, 1.8=1, -1.8=-1, -1.8=-2.
r( R ) = RIA.
第三十页第三,十共页 50页。
定理23
定理23: 设 RAA 且 A, 则
s( R ) = RR-1; 证明: (1) R RR-1;
(2) (RR-1)-1=RR-1 RR-1对称 s( R )RR-1;
(3) Rs( R ) s( R )对称 Rs( R ) R-1s( R ) RR-1s( R )
s( R1R2) = s( R1 )s( R2 )
第二十第六二页十,六共页50页。
定理21(证明(3))
(3) t( R1R2) t( R1 )t( R2 ). 证明(3): 利用定理20,
t(R1R2)t(R1)t(R2). 反例: t(R1R2)t(R1)t(R2) . #
a
b
G(R1)= G(t(R1))
第十七第页十,七共页50页。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《离散数学》
实验报告
学院软件学院
专业软件工程
指导教师邹丽娜
学号********
姓名冯立勇
提交日期2011-12-25
实验二 关系的闭包运算
一 、实验目的
熟悉关系的闭包运算,编程实现关系闭包运算算法。
一 、实验内容
利用矩阵求解有限集上给定关系的自反、对称和传递闭包。
三. 实验过程
1. 算法分析:
在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为1就可;对称闭包则加上关系的转置矩阵(逻辑加法);传递闭包则有两种算法(二选一即可):
算法1:直接根据 n i i R
R t 1)(==计算,过程略。
算法2:Warshall 算法(1962)
设R 的关系矩阵为M
(1)令矩阵A=M
(2)置i=1
(3)对所有的j ,若A[j ,i]=1,则
对于 k=1,2,…,n ,令A[j ,k]=A[j ,k]+A[i ,k]
注:此处为逻辑加,可以使用运算符||
(4) i=i+l .
(5)若i ≤n ,则转到(3),否则结束.
流程图
2. 程序代码:
#include<stdio.h>
void output(int s[][100]);
void zifan(int s2[][100]);
void duichen(int s2[][100]);
void chuandi2(int s2[][100]);
void chuandi1(int s2[][100]);
void aa();
int s[100][100],z;
int d,n ,i,j;
int main(){aa();return 0;}
void aa()
{
printf("请输入矩阵的行数(必须小于10)\n ");
scanf("%d",&n);
printf("请输入矩阵的列数(必须小于10)\n ");
scanf("%d",&d);
printf("请输入关系矩阵\n");
for(i=0;i<n;i++)
{ printf("\n");
printf("请输入矩阵的第%d行元素",i);
for(j=0;j<d;j++)
scanf("%d",&s[i][j]);
}
printf("输入对应序号选择算法\n1:自反闭包\n2:传递闭包1\n3:传递闭包(Warhall算法)2\n4:对称闭包\n");
scanf("%d",&z);
switch(z)
{
case 1:zifan(s); break;
case 2:chuandi1(s);break;
case 3:chuandi2(s);break;
case 4:duichen(s); break;
}
}
void output(int s[][100])
{printf("所求关系矩阵为\n"); for(i=0;i<n;i++)
{for(j=0;j<d;j++)
printf("%d",s[i][j]);
printf("\n");
}
}
void zifan(int s2[][100])
{
for(i=0;i<n;i++)
s2[i][i]=1;
output(s2);aa();
}
void duichen(int s2[][100])
{int s1[100][100];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
s1[j][i]=s2[i][j];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{s2[i][j]=s2[i][j]+s1[i][j];
if(s2[i][j]>1)
s2[i][j]=1;
}
output(s2);
aa();
}
void chuandi1(int s2[][100]) {int m[100][100],a[100][100],k,h; int t[100][100];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{ a[i][j]=0;
t[i][j]=s2[i][j];
m[i][j]=s2[i][j];}
for(h=0;h<n;h++)
{for(i=0;i<n;i++)
for(j=0;j<d;j++)
if(m[i][j]==1)
{for(k=0;k<n;k++)
if(s2[j][k]==1)
a[i][k]=1;
}
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{ m[i][j]=a[i][j];
t[i][j]+=a[i][j];
a[i][j]=0;
if(t[i][j]>1)
t[i][j]=1;
}
}
output(t);aa();
}
void chuandi2(int s2[][100]) {int k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(s2[j][i]==1)
for(k=0;k<n;k++) s2[j][k]+=s2[i][k];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(s2[i][j]>1)
s2[i][j]=1;
output(s2);aa();
}
3.实验数据及结果分析。