关系是有序对的集合

  • 关系可能具有的性质定义

以下均假设R是集合A上的二元关系:

  1. 自反性 ,如果对于A中的每个元素x,都有<x, x> 属于R,则称R具有自反性。
  2. 反自反性(irreflexivity) ,如果对于A中每个元素x,都有<x, x>不属于R,则称R具有反自反性。
  3. 对称性,如果对于R中的每个有序对<x, y>都有对应的有序对<y, x>也属于关系R,则称R具有对称性。
  4. 反对称性,如果对于R中的每个有序对<x, y>,且<y, x>也属于关系R,那么x == y一定成立,则称R具有反对称性。注意:有些关系既是对称的,又是反对称的,如相等关系;有些关系是对称的,但不是反对称的,如Z中的“绝对值相等”;有些关系是反对称的,但不是对称的,如Z中的≤和<;还有的关系既不是对称的,又不是反对称的。
  5. 传递性 对于A中的元素x, y, z, 如果<x, y>属于R并且<y, z>属于R,那么<x, z>就属于R,则称R具有传递性。
  • 偏序集(partical order)

设R是集合A上的一个关系,如果R是自反的、反对称的和可传递的,则称R是集合A的偏序关系,简称偏序,记作“≤”。这里的符号不仅仅指我们之前学过的具体符号,而是偏序的符号,当然小于等于号(对应的关系)本身是典型的偏序关系。
一般将一个集合A和定义在其上的偏序关系R一起称为偏序集。
wiki定义:https://en.wikipedia.org/wiki/Partially_ordered_set#Strict_and_non-strict_partial_orders
对于集合A中的元素x和y而言,如果有序对<x, y>或者<y, x>属于偏序关系R,则称x和y是可比较的(comparable),否则称x和y是不可比较的(incomparable)。如果集合A中的任意两个元素之间是可比较的,则称偏序关系R为全序关系(total order)。

  • 全序集(total order)

对于一个偏序集A,R,如果对于A中的任意两个元素x和y,有序对<x, y>和<y, x>至少有一个属于关系R,则称R为序关系,A和R一起称为全序集合/有序集。和上面的定义本质上是一样的。

举例:一个偏序集而不是全序集的例子,集合的包含关系,两个集合间可能是不可比较的。

  • 严格和非严格偏序关系(strict and non-strict partial orders)

上述定义的偏序集可以认为是非严格的,主要是为了与下面的严格偏序集做对比:
一个严格偏序关系需要具有如下性质:
反自反性,传递性和反对称性。记作小于号符号,和上面的定义类似,这里仅作为一个符号使用,当然我们熟悉的小于号对应的关系是典型的严格偏序关系。

  • 严格的弱序关系(strict weak orderings)

如果一个严格偏序集(集合A与定义在集合A上的严格偏序关系R)的关系R满足:如果A上的元素x,y,z,x和y是不可比较的,y和z是不可比较的,则x和z是不可比较的。那么称这样的关系为严格弱序关系,也就是说具有可传递的不可比较性。

  • 等价关系(equivalence relation)

一个等价关系应该具有如下性质:
自反性,传递性,对称性。
注意到,严格弱序集上的不可比较的关系(incomparability relation)是一种等价关系。 // 个人猜测,官方说法很模糊。
证明:
//注意理解,不可比较关系是依附于某个关系定义的,即是关系的关系。
//自反性:x和x是不可比较的,因为严格弱序是反自反的,所以!(xRx) && !(xRx)为真。
//传递性:!(xRy) && !(yRx)为真,!(yRz) && !(zRy)为真,则由于严格弱序关系的额外性质,即可传递的不可比较性,因此!(xRz) && !(zRx)为真,不可比较关系是传递的
//对称性:!(xRy) && !(yRx)为真,则由于逻辑运算左右两侧交换不影响结果,因此不可比较关系是对称的。
所以说严格弱序关系的定义保证了定义在其上的不可比较关系是等价关系。
wiki : https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings


以上是前导知识,现在看下今天要说的c++中的一个concept:Compare。这个concept在c++的标准库中广泛涉及并使用,例如关联容器set和map中,算法sort中等等,url : https://en.cppreference.com/w/cpp/named_req/Compare
具体的requirements见上链接即可,总的来说就是满足Compare的类的对象是一个函数对象,等同于关系,其两个参数等同于元素,这个关系应该是一个严格弱序关系。

注意标准中的这句话:Note: comp induces a strict total ordering on the equivalence classes determined by equiv
这个严格弱序关系在equiv定义的等价类上是一个严格全序关系
//equiv就是上文中的不可比较关系(也是等价关系),原集合可以被划分为不同的等价类,每个等价类是一个子集合,该集合中的元素两两等价。
这其实很好理解,只要x和y来自不同的等价类,那么<x, y>或者<y, x>至少有一个属于严格弱序关系的集合--因为根据定义都不属于的话x和y肯定在一个等价类中。

因此,当你为map和set以及可重复版本提供自定义类型的key时,以及对自定义类型的对象进行sort排序时(无论使用默认版本还是提供比较函数,因为默认版本最终还是要调用operator<)都要注意,你定义的关系需要满足严格弱序关系。


之后会举一个例子说明,这种情况并不少见,而且有时候比较复杂和隐晦。

之前写过一个将三维物体体素化的程序(数值模拟中也叫网格剖分),该程序准备工作部分的主要流程如下:

void StlEntity::init_topo() {
//1.遍历三角面片,构造三角面片索引表
//构造点索引表,记录每个点所在的三角面片索引
_create_tria_set_and_point_set_();

//合并相同点,并继承所属三角面片信息
_merge_point_set_();

//此时节点合并完成,且每个节点所属于的三角面片的索引更新完成。
//为每个三角面片设置顶点索引
_set_point_index_of_tria_set_();

//构建边索引集合
_create_edge_set_();

//合并重复边
_merge_edge_set_();

//给每个三角面和点设置边索引
_set_edge_index_for_tria_and_point_set_();

//拓扑检查
topo_check();
}
  • 背景知识,可以跳过这段不影响阅读

准备部分主要是将STL格式文件中的数据读入内存,然后通过分析和处理构建等价的内部表示,最后进行拓扑检查。这么做的原因主要有两个,其一是后续的体素化过程的一些处理需要特殊的数据结构支持,其二是为了进行拓扑检查,因为当三维实体特征十分复杂时特别容易出现STL缺陷,例如缝隙,多余三角面片,空洞等等,这些缺陷需要被尽早识别出来并处理掉,否则后续的算法会发生错误。

其中第二部分合并相同点,需要对三维点的集合做一个排序,让三维空间中同一个点在数组中相邻,然后通过一遍扫描工作就可以合并相同点了。注意,理论上相同的点在表示上并不一定是相等的,因为STL文件的转换本身具有误差,而且导入内存时计算机表示浮点数本身会损失精度,那么我们如何提供三维空间点的operator<函数,才能正确使用std::sort呢?
下面是我的实现:

struct point {
double x;
double y;
double z;
...
bool operator<(const point& other) const {
  if (x < other.x) {
    return true;
  }
  if (x == other.x && y < other.y) {
    return true;
  }
  if (x == other.x && y == other.y && z < other.z) {
    return true;
  }
  return false;
}
...
};

下面证明上述operator<定义的关系在三维空间点组成的集合中是一个严格弱序关系。

  1. 反自反性:对于每个三维点x, x < x表达式返回的值永远是false,这是显然的。(这里基于一个假设,尽管浮点数的存储损失精度,但对一个已经存储在内存中的浮点数,其任何通过复制得到的浮点数以及自己和自己的比较结果x == x应该都返回true,我不知道c++是不是保证了这一点。)
  2. 反对称性:由于反自反性的存在,因此反对称性等价的表述为:对于任何的x < y == true, 一定有y < x == false。根据上面的定义,如果x < y返回true,只可能是三个分支条件中的一个成立,穷举一下可以发现这三种情况下y < x都返回false。
  3. 传递性:如果x < y == true && y < z == true,同样把x<y和y<z的三种情况组合下一共有九种情况,每一种情况一定有x < z == true成立。
  4. 不可比较性的传递性:如果x和y是不可比较的,y和z是不可比较的,下面证明x和z是不可比较的,当x和y不可比较时,表达式!(x < y) && !(y < x) == true,等价的x < y || y < x == false,即x < y == false和y < x == false同时成立,则 x.x == y.x && x.y == y.y && x.z == y.z为真,同理y.x == z.x && y.y == z.y && y.z == z.z为真, 所以x.x == z.x && x.y == z.y && x.z == z.z为真,带入可知!(x < z) && !(z < x) == true,即x和z是不可比较的。

综上,operator<定义的关系在三维空间点组成的集合中是一个严格弱序关系。


p__n
491 声望10 粉丝

科学告诉你什么是不可能的;工程则告诉你,付出一些代价,可以把它变成可行,这就是科学和工程不同的魅力。