南京邮电大学离散数学实验二(二元关系的性质判定)

本文档详述了一个使用C++实现的实验,旨在检测二元关系的自反性、反自反性、对称性、反对称性和传递性。实验通过全局变量和一系列函数来处理关系矩阵,核心算法的时间复杂度为O(n^2)和O(n^3)。测试数据涵盖了不同情况,实验结果揭示了关系的各种性质。实验者在过程中提升了编程能力和对二元关系理解的深度。
摘要由CSDN通过智能技术生成

零、相关简介

好的,以下是为您生成的关于离散数学二元关系的性质判定简介。

离散数学二元关系的性质判定是离散数学中一个重要的主题,涉及到关系的众多性质,如自反性、反自反性、对称性、反对称性、传递性等。正确理解和判定这些性质对于掌握和应用离散数学至关重要。本文旨在简要介绍二元关系的基本定义和几种基本性质,以及如何进行性质判定

1、二元关系的基本定义

在离散数学中,二元关系是定义在两个集合之间,即对于任意的 a ∈ A a \in A aA b ∈ B b \in B bB,能够判断 ( a , b ) (a, b) (a,b)是否满足某种条件或规则。这种条件或规则就是所谓的二元关系 R R R。可以表示为 R ⊆ A × B R \subseteq A \times B RA×B

2、二元关系的基本性质

  1. 自反性:若对于集合 A A A中的所有元素 x x x,都有 ( x , x ) ∈ R (x, x) \in R (x,x)R,则称 R R R A A A上是自反的。
  2. 反自反性:若对于集合 A A A中的所有元素 x x x,都有 ( x , x ) o t i n R (x, x) otin R (x,x)otinR,则称 R R R A A A上是反自反的。
  3. 对称性:若对于任意的 x , y ∈ A x, y \in A x,yA,当 ( x , y ) ∈ R (x, y) \in R (x,y)R时,总有 ( y , x ) ∈ R (y, x) \in R (y,x)R,则称 R R R A A A上是对称的。
  4. 反对称性:若对于任意的 x , y ∈ A x, y \in A x,yA,当 ( x , y ) ∈ R (x, y) \in R (x,y)R ( y , x ) ∈ R (y, x) \in R (y,x)R时,必有 x = y x = y x=y,则称 R R R A A A上是反对称的。
  5. 传递性:若对于任意的 x , y , z ∈ A x, y, z \in A x,y,zA,当 ( x , y ) ∈ R (x, y) \in R (x,y)R ( y , z ) ∈ R (y, z) \in R (y,z)R时,总有 ( x , z ) ∈ R (x, z) \in R (x,z)R,则称 R R R A A A上是传递的。

3、性质的判定方法

  1. 自反性的判定:检查集合 A A A中的每个元素 x x x是否都满足 ( x , x ) ∈ R (x, x) \in R (x,x)R。如果是,则 R R R是自反的;否则,不是自反的。
  2. 反自反性的判定:检查集合 A A A中的每个元素 x x x是否都不满足 ( x , x ) ∈ R (x, x) \in R (x,x)R。如果是,则 R R R是反自反的;否则,不是反自反的。
  3. 对称性的判定:对于 R R R中的任意一对元素 ( x , y ) (x, y) (x,y),检查是否总有 ( y , x ) ∈ R (y, x) \in R (y,x)R。如果是,则 R R R是对称的;否则,不是对称的。
  4. 反对称性的判定:对于 R R R中的任意一对元素 ( x , y ) (x, y) (x,y) ( y , x ) (y, x) (y,x),如果它们同时存在于 R R R中,则检查是否总有 x = y x = y x=y。如果是,则 R R R是反对称的;否则,不是反对称的。
  5. 传递性的判定:对于 R R R中的任意三个元素 ( x , y ) (x, y) (x,y) ( y , z ) (y, z) (y,z),检查是否总有 ( x , z ) ∈ R (x, z) \in R (x,z)R。如果是,则 R R R是传递的;否则,不是传递的。

4、总结

二元关系的性质判定是离散数学中的一个基础而重要的内容。通过理解并应用上述判定方法,可以有效地确定一个二元关系是否具有特定的性质。这对于解决实际问题,如逻辑推理、图论分析等,具有重要的理论和实践意义。掌握这些判定方法,不仅能够帮助更好地理解离散数学的基本概念,还能为进一步学习和研究提供坚实的基础。

一、 实验目的和要求

中文五号宋体,英文五号Times new roman字体,1.25倍行距
描述本次实验的目的和要求。

二、实验环境(实验设备)

中文五号宋体,英文五号Times new roman字体,1.25倍行距
硬件:微型计算机
软件:Windows 操作系统、Microsoft Visual C++6.0、Java等可视化编程语言

三、实验原理及内容

中文五号宋体,英文五号Times new roman字体,1.25倍行距
说明:这部分内容主要包括:
1、形式化描述实验中所使用的数据结构和存储结构,给出函数之间的调用关系和数据传递方式;
2、给出核心算法的C++或Java等语言的源代码,并加上详细注释,分析算法的时间复杂度;
3、给出测试数据及运行结果、实验相关结论等。

(一)数据结构

1、全局变量:

#define MAX 100  
bool flag_ref, flag_irr, flag_sym, flag_dis, flag_tra;  //判断自反性、反自反性、对称性、反对称性、传递性的 flag  
int arr[MAX][MAX];  
int n;

2、函数调用关系

int main()
{  
   initial();          //相关初始化,从键盘获取信息。  
    Reflexive();        //自反性  
    Irreflexive();      //反自反性  
    Symmetrical();      //对称性  
    Dissymmetrical();   //范对称性  
    Transitive();       //传递性  
    print();            //打印结果  
    return 0; 
} 

(二)核心代码

1、代码

//自反性  
void Reflexive() {  
    for (int i = 0; i < n; i++) {  
        //如果存在对角线为0,则为假。 
        if (arr[i][i] == 0) {   
            flag_ref = 0;  
        }  
    }  
}  

//反自反性  
void Irreflexive() {  
    for (int i = 0; i < n; i++) {
    	//如果存在对角线为1,则为假。     
        if (arr[i][i] == 1) {   
            flag_irr = 0;  
        }  
    }  
}  

//对称性  
void Symmetrical() {  
    for (int i = 0; i < n; i++) {  
        for (int j = 0; j < n; j++) {  
       		//如果存在arr[i][j] != arr[j][i],则为假。  
			if (arr[i][j] != arr[j][i]) {   
				flag_sym = 0;  
			}  
		}  
	}  
} 

//反对称性  
void Dissymmetrical() {  
    for (int i = 0; i < n; i++) {  
        for (int j = 0; j < n; j++) { 
 		//如果存在arr[i][j] = arr[j][i],则为假。   
            if (arr[i][j] == arr[j][i]) {  
                flag_dis = 0;  
            }  
       }  
    }  
}  
	  
	  
//传递性  
void Transitive() {  
    for (int i = 0; i < n; i++) {  
        for (int j = 0; j < n; j++) {  
            for (int k = 0; k < n; k++) {  
				//如果存在arr[i][j] = 1 且 arr[j][k] = 1,找不到arr[i][k] = 1,则为假。  
                if (arr[i][j] && arr[j][k] && !arr[i][k]) {   
                    flag_tra = 0;  
                }  
            }  
       }  
    }  
}  

2、时间复杂度为O(n2)和O(n3)

(三)测试数据及结果结论

1、测试1

请输入元素个数  
	1  
请输入集合各元素  
	1  
集合A = {1}  
请输入关系矩阵  
	1  
  
具有以下关系  
	自反性  
	对称性  
	传递性 

2、测试2

请输入元素个数  
	3  
请输入集合各元素  
	1 4 5  
集合A = {1,4,5}  
请输入关系矩阵  
	1 0 1  
	0 0 0  
	1 0 0  
	  
具有以下关系  
	对称性 

3、测试3

请输入元素个数  
	2  
请输入集合各元素  
	1 3  
集合A = {1,3}  
请输入关系矩阵  
	1 0  
	0 1  
	  
具有以下关系  
	自反性  
	对称性  
	传递性  

四、实验小结(包括问题和解决方法、心得体会、意见与建议等)

(一)实验中遇到的主要问题及解决方法

  1. 没有什么好办法将全局变量全部化为局部变量。

(二)实验心得

  1. 学会了如何利用计算机求解二元关系的性质。
  2. 提高了自己的编程能力。
  3. 对二元关系的性质有了更深入的理解。

(三)意见与建议(没有可省略)

五、全部源代码(Java)

#include <iostream>
using namespace std;

#define MAX 100
bool flag_ref, flag_irr, flag_sym, flag_dis, flag_tra;  //判断自反性、反自反性、对称性、反对称性、传递性的 flag
int arr[MAX][MAX];
int n;

void initial(){
	int a[MAX];
	flag_ref = flag_irr = flag_sym = flag_dis = flag_tra = 1;
	cout << "请输入元素个数" << endl;
	cin >> n;
	cout << "请输入集合各元素" << endl;
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}
	cout << "集合A = {";
	for (int i = 0; i < n - 1; ++i) {
		cout << a[i] << ",";
	}
	cout << a[n - 1] << "}" << endl;
	cout << "请输入关系矩阵" << endl;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			cin >> arr[i][j];
		}
	}
	cout << endl;
}

//自反性
void Reflexive() {
	for(int i = 0; i < n; i++){
		if(arr[i][i] == 0){
			flag_ref = 0;
		}
	}
}


//反自反性
void Irreflexive() {
	for(int i = 0; i < n; i++){
		if(arr[i][i] == 1){
			flag_irr = 0;
		}
	}
}


//对称性
void Symmetrical() {
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			if(arr[i][j] != arr[j][i]){
			flag_sym = 0;
			}
		}
	}
}


//反对称性
void Dissymmetrical() {
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			if(arr[i][j] == arr[j][i]){
			flag_dis = 0;
			}			
		}
	}
}


//传递性
void Transitive() {
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			for(int k = 0; k < n; k++){
				if(arr[i][j] && arr[j][k] && !arr[i][k]) {
					flag_tra = 0;
				}	
			}
		}
	}
}

void print(){
	cout << "具有以下关系" << endl;
	if (flag_ref) {
		cout << "自反性" << endl;
	}
	if (flag_irr) {
		cout << "反自反性" << endl;
	}
	if (flag_sym) {
		cout << "对称性" << endl;
	}
	if (flag_dis) {
		cout << "反对称性" << endl;
	}
	if (flag_tra) {
		cout << "传递性" << endl;
	}
	cout << endl;
}

int main() {
	initial();
	Reflexive();
	Irreflexive();
	Symmetrical();
	Dissymmetrical();
	Transitive();
	print();
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦是远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值