*离散数学二元关系的闭包运算
如:自反性,对称性,传递性以及Wrashall算法,下面将用Java实现
一.处理二元关系的类(ArraysSetOperation):
public class ArraysSetOperation {
private int[][] array;
private int[][] array2 = new int[7][7];
public ArraysSetOperation(int[][] array) {
this.array = array;
}
/**
* initialize the value of the array.
* @param x is the line number of array, y is the columns number of array.
*/
public void setArrays(int x1, int y1) {
array[x1][y1] = 1;
array2[x1][y1] = 1;
}
public void setArrays(int x1, int y1, int x2, int y2) {
array[x1][y1] = 1;
array[x2][y2] = 1;
array2[x1][y1] = 1;
array2[x2][y2] = 1;
}
public void setArrays(int x1, int y1, int x2, int y2, int x3, int y3) {
array[x1][y1] = 1;
array[x2][y2] = 1;
array[x3][y3] = 1;
array2[x1][y1] = 1;
array2[x2][y2] = 1;
array2[x3][y3] = 1;
}
public void setArrays(int[] x, int[] y) {
for(int i=0; i<x.length; i++){
array[x[i]][y[i]] = 1;
array2[x[i]][y[i]] = 1;
}
}
/**
* 实现Wrashall算法求二元关系传递闭包的关系
*/
public void Wrashall() {
for(int j=0; j<array.length; j++) {
for(int i=0; i<array.length; i++) {
if(array2[i][j] == 1) {
for(int k=0; k<array[j].length; k++){
array2[i][k] = array2[i][k] + array2[j][k];
if(array2[i][k]>1)
array2[i][k] = 1;
}
}
}
}
}
/**
* make the array to have reflexivity
*/
public void reflexivity() {
for(int i=0; i<array.length; i++) {
array2[i][i] = 1;
}
}
/**
* make the array to have symmetry
*/
public void symmetry() {
for(int i=0; i<array.length; i++) {
for(int j=0; j<array[i].length; j++) {
if(array[i][j] == 1)
array2[j][i] = 1;
}
}
}
/**
* make the array to have transitivity
*/
public void transitivity()
{
for(int i=0; i<array.length; i++)
{
for(int j=0; j<array[i].length; j++)
if(array[i][j] == 1)
for(int k=0; k<array[j].length; k++)
if(array[i][j] == array[j][k])
array2[i][k] = 1;
}
}
/**
* print the array which was changed
*/
public void getArray() {
for(int i=0; i<array2.length; i++) {
for(int j=0; j<array2[i].length; j++)
System.out.printf(array2[i][j] + " ");
System.out.println();
}
//初始化二元关系数组
for(int i=0; i<array.length; i++)
for(int j=0; j<array[i].length; j++)
array2[i][j] = array[i][j];
}
}
二.有主函数的类(WrashallTest):
/**
* 这个程序是为了实现离散数学中二元关系的部分性质和算法
* @author Xuer
* @version 1.0无界面版本
* 时间:2018-05-19
* 此方法仅示范于7×7数组,如需其他数组,请自行改动
*/
public class WrashallTest {
public static void main(String[] args) {
//创建7×7 的数组
int[][] Arrays = new int[7][7];
//创建一个处理求二元关系的对象
ArraysSetOperation a = new ArraysSetOperation(Arrays);
System.out.println("原来的二元关系为:");
//将部分数组中的值设置为1
/*
* 1.若设置的值个数小于等于3则使用setArrays(int x1..., int y1...)
* 2.若设置的值个数大于3则使用setArrays(int[] x, int[] y)
*/
int[] x = {0,0,1,2,3}; //对应x坐标
int[] y = {0,1,3,4,1}; //对应y坐标
a.setArrays(x, y);
//输出所定义的集合
a.getArray();
System.out.println("实现自反性:");
a.reflexivity();
a.getArray();
System.out.println("实现对称性:");
a.symmetry();
a.getArray();
System.out.println("实现传递性:");
a.transitivity();
a.getArray();
System.out.println("实现wrashall算法:");
a.Wrashall();
a.getArray();
}
}
①自反性:
定义:设 R是 A上的一个二元关系,若对于 A中的每一个元素 a, (a,a)都属于 R,则称 R为自反关系。换言之,在自反关系中, A中每一个元素与其自身相关。
由定义可知array[i][i]都属于A上的二元关系R,所以将array2[i][i]都赋值为1
public void reflexivity() {
for(int i=0; i<array.length; i++) {
array2[i][i] = 1;
}
}
②对称性:
定义:对称关系(symmetrical relation)是一种特殊的关系,指与自身的逆关系完全相同的那种关系。集合A上的二元关系R,对任何a,b∈A,当aRb时有bRa,用符号表示:R是A上的对称关系⇔∀a∀b(a∈A∧b∈A∧aRb→bRa)。当A上的R是对称关系时,称R在A上是对称的,或称A上的关系R有对称性。例如,数集中的关系I={〈x,y〉|x与y相等},N={〈x,y〉|x与y不等}都是对称关系;而L={〈x,y〉|x小于y}不是对称关系,当A上的关系R是对称的时,它的补关系与逆关系都是对称的,且R=R-1
即:若存在array[i][j]属于二元关系R,则有array[j][i]也属于R, 所以将array2[[j][i]也赋值于1.
public void symmetry() {
for(int i=0; i<array.length; i++) {
for(int j=0; j<array[i].length; j++) {
if(array[i][j] == 1)
array2[j][i] = 1;
}
}
}
③传递性:
定义:传递关系(transitive relation)是一种特殊的关系,指由甲、乙和乙、丙都有,可推知甲、丙也有的那种关系。集合A上的二元关系R,对任何a,b,c∈A,当aRb,bRc时,有aRc,用符号表示:R是A上的传递关系⇔∀a∀b∀c(a∈A∧b∈A∧c∈A∧aRb∧bRc→aRc)。当A上的R是传递关系时,称R在A上是传递的,或说A上的关系R有传递性。例如,实数集中的小于关系与不小于关系都是传递的;而人群中的同学关系是不传递的。若R在A上是传递的,则R°R⊆R;反之,如R°R⊆R,则R在A上是传递的。一个反自反的传递关系是不对称的,一个反自反的对称非空关系不是传递关系。
当array[i][j] == array[j][k]时, 将array[i][k] = 1
public void transitivity()
{
for(int i=0; i<array.length; i++)
{
for(int j=0; j<array[i].length; j++)
if(array[i][j] == 1)
for(int k=0; k<array[j].length; k++)
if(array[i][j] == array[j][k]) array2[i][k] = 1;
}
}
}
}
④Wrashall算法:
步骤:(1):按列进行扫描
(2):如:当array[i][j] = 1 时, 将array数组中第 i 行中所有元素与第 j 行所对应元素分别进行逻辑加,并将所得值覆盖第 i 行的元素。
public void Wrashall(){
for(int j=0; j<array.length; j++){
for(int i=0; i<array.length; i++){
if(array2[i][j] == 1){
for(int k=0; k<array[j].length; k++){
array2[i][k] = array2[i][k] + array2[j][k];
if(array2[i][k]>1)
array2[i][k] = 1;
}
}
}
}
}
最后声明:本人大一Java初学者,方方面面做的不好,还请阅读者包含。
本博客将成为我的云笔记本,记录我的学习足迹,
以上。