用C语言或者C++判断一段关系是否是等价关系,如果是找出它的划分,如若不是,求包含它的最小等价关系 |
您所在的位置:网站首页 › 等价关系如何划分的 › 用C语言或者C++判断一段关系是否是等价关系,如果是找出它的划分,如若不是,求包含它的最小等价关系 |
我们可以首先写一个名叫Relation的类。在这个类中,我们将会有等价关系对应的集合的维度d以及该等价关系的关系矩阵,如下图 而这个类有三种构造函数和一个析构函数 这些源码我将会在文章的最后给出,代码逻辑较简单,就不赘述了。 在该类中还写了获取维度,运算符重载,得到关系矩阵指定位置的值,在屏幕上打印关系矩阵的值等一系列函数,具体代码可见源码 最后写了判断三种性质(自反,对称,传递)的函数,以及通过这三个函数来判断是否为等价关系函数,如果是求划分的函数,如果不是求最小等价关系的函数 下图为判断是否为等价关系的函数,由等价关系的定义,只需要该关系具有自反性,对称性,传递性 即可 下图为求一个关系的最小等价关系,我们知道以下三个式子恒成立 (1)r(s(R))=s(r(R)) (2) r(t(R)=t(r(R)) (3) t(s(R)包含s(t(R)) 因此我们可以先求该关系的自反闭包,再求得到的自 反闭包的对称闭包,最后求得到的对称闭包的传递关 系,因此首先我们可以先写三个函数:已知一个关系,求它的自反闭包,对称闭包,传递闭包。代码如下图: 已经有了这三个函数,那么便可以找出它的最小等价关系,代码如下图 如果一个关系为等价关系,那么求等价类。 result是一个大小为dimension的数组,如果当前关系 是等价关系,则result中存放的是当前关系的各个元素 所在等价类的编号,返回true;否则result数组中任一项的值都是-1,并返回false。 最后的main函数:首先屏幕会打印“请先输入该集合的元素个数:”,然后打印“依次输出该集合各元素的值:”最后会打印“输入该关系的关系矩阵:”,然后便会判断关系性质,是否等价,如果等 价,划分是什么,如果不等最小等价类是什么。下图为测试用例 最后,给出源码 #include "stdio.h" #include #include using namespace std; class Relation { protected: int dimension; int *Matrix; public: Relation(int d = 1); //构造维数为d的空关系,如果不输入d的值,则默认为1 Relation(int d, const int *M);//由输入的关系矩阵的维数与一个关系矩阵的值的数组构造关系 Relation(const Relation &r);//拷贝构造函数 ~Relation();//析构函数 Relation &operator =(const Relation &r); //赋值运算符重载 int GetDimension() const; //返回关系矩阵的维数 int GetatPosition(int row, int column) const; //得到关系矩阵的第row行第column列的值,如果越界则返回-1 int operator() (int row, int column) const; //可以使用R(i,j)来得到关系矩阵的第row行第column列的值, //如果越界则返回-1 bool GetMatrix(int *result) const; //得到关系矩阵的值 void Output() const; //在屏幕显示该关系的关系矩阵 bool IsReflexive() const; //判断该关系是否自反 bool IsSymmetric() const; //判断该关系是否对称 bool IsTransitive() const; //判断该关系是否传递 Relation ReflexiveClosure() const; //返回自反闭包的关系矩阵 Relation SymmetricClosure() const; //返回对称闭包的关系矩阵 Relation TransitiveClosure() const; //返回传递闭包的关系矩阵 bool IsEquivalence() const; //判断该关系是否是一个等价关系 Relation minEquivalence()const; //求最小的等价关系 bool EquiClasses(int *result) const; //result是一个大小为dimension的数组,如果当前关系 //是等价关系,则result中存放的是当前关系的各个元素 //所在等价类的编号,返回true;否则result数组中任一 //项的值都是-1,并返回false。 }; Relation::Relation(int d) { //构造一个维数为d的空关系 dimension = d; Matrix = new int[dimension * dimension]; memset(Matrix, 0, sizeof(int) * dimension * dimension); } Relation::Relation(int d, const int *M) { //由关系矩阵的维数和一个关系矩阵的值的数组构造关系 dimension = d; Matrix = new int[dimension * dimension]; memcpy(Matrix, M, sizeof(int) * dimension * dimension); } Relation::~Relation() { //析构函数 delete []Matrix; } //拷贝构造函数 Relation::Relation(const Relation &r) { dimension = r.dimension; Matrix = new int[dimension * dimension]; memcpy(Matrix, r.Matrix, sizeof(int)*dimension * dimension); } //赋值运算符重载 Relation &Relation::operator =(const Relation &r) { dimension = r.dimension; Matrix = new int[dimension * dimension]; memcpy(Matrix, r.Matrix, sizeof(int)*dimension * dimension); return *this; } int Relation::GetDimension() const { //得到关系矩阵的维数 return dimension; } int Relation::GetatPosition(int row, int column) const { //得到关系矩阵的第row行第column列的值,如果越界则返回-1 if (row >= 0 && row < dimension && column >= 0 && column < dimension) return Matrix[row * dimension + column]; else return -1; } int Relation::operator()(int row, int column) const { //可以使用R(i,j)来得到关系矩阵的第row行第column列的值,如果越界则返回-1 if (row >= 0 && row < dimension && column >= 0 && column < dimension) return Matrix[row * dimension + column]; else return -1; } bool Relation::GetMatrix(int *result) const { //得到关系矩阵的值 if (result != NULL) { memcpy(result, Matrix, sizeof(int)*dimension * dimension); return true; } return false; } void Relation::Output() const { //在屏幕显示该关系的关系矩阵 int row, column; cout |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |