引言
信息学竞赛中有个很经典的问题——偏序问题。
可能很多人并没有听说过什么是偏序问题,但大多应该都听说过逆序对和最长上升子序列问题。这两个问题都是偏序问题的一种。
先来理解下偏序关系的定义。
定义
偏序关系
设R是集合A上的一个二元关系,若R满足:
则称R为A上的偏序关系,通常记作≼。
给定集合S,“<”是S上的二元关系,若“<”满足:
则称“<”是S上的严格偏序或反自反偏序。
与非严格的偏序关系不同的地方就是没有反对称性,取而代之的是非对称性。上面写的包含关系是一种偏序关系,更准确的说,包含关系是非严格的偏序关系,而真包含是严格的偏序关系。
全序关系
偏序和全序是公里集合论中的概念,全序关系是偏序关系的一个子集,如果是全序关系那必然是偏序关系,全序关系在全序关系上增加了一个完全性。
设R是集合A上的一个二元关系,若R满足:- R是集合A上的一个偏序关系。
- 完全性:对任意x∈A,y∈A,存在 (x,y)∈R或(y,x)∈R
在实数集上的大于小于号等大小关系,更准确的说应该属于一种全序关系,因为实数集上所有的数都能比较。但如果将数域扩展到复数域,复数域中的部分数是不能比较的,所以复数域中的大于小于号等大小关系是偏序关系而不是全序关系。同样的,集合之间的包含关系也不是全序关系,因为两集合可以处于不包含也不被包含的互相独立的状态。
正文
偏序问题
给定序列A,其中有序对(Ai,Aj),满足 i<j 且 Ai<Aj这样的有序对我们称之为逆序对,
信息学竞赛中的逆序对问题,一般是要我们计数给出序列的逆序对个数的总和。
其实可以把它看成一个特殊的二维偏序问题,或者说是离散化x坐标的二维偏序问题。
我们把给定的序列A ,加上一个编号,变成一个二元组,即A1-->(A1,1) ,A2-->(A2,2) Ai-->(Ai,i)。存在两个二元组(a,b),(c,d),满足 a > c 且 b < d 的个数。我们将二元组放在一个二维空间中,二元组(x,y)表示坐标为(x,y)的点,此时我们就会发现实际上逆序对问题,就是一种二维偏序问题。
何为二维偏序问题? 在二元组中定义一种偏序关系R,统计R集合中元素的个数。
比如逆序对问题,定义的关系就是:两个二元组(a,b),(c,d),满足 a > c 且 b < d 。易知它满足偏序关系的3个定义,并且任意的两个二元组也不都有关系,所以就不是全序,当然由于逆序对问题一般不会出现重复的数字,所以前两个定义需要特别判断,但它可以满足最后的也是最重要的一条性质——传递性。也正是因为传递性我们才能使用各种算法来解决它们。
在信息学竞赛中我们解决逆序对使用的是,线段树或归并排序,实际上这里的归并排序就是cdq分治,实际上都是使用的分治法。
这两种方法本质上相同,都是通过排序解决一个维度的问题,然后再使用分治快速处理另外一个维度的问题。
特别的最长上升子序列问题也是一种偏序问题,实际上可以转换为,给出n个元素的二元组集合S,其中有二元组(A1,1),(A2,2)...(An,n),在二元组中有关系R,定义为 二元组A (a,b)R B(c,d)当且仅当b<d 且 a<c,求集合S的一个最大子集满足,子集中的关系R为全序关系。