C++ 与总顺序相比,部分顺序是否足以构建堆?
C++std::priority_队列只需要部分顺序。但是如果它的实现是一个二进制堆,它是如何工作的呢? 例如:假设我们有一个偏序集C++ 与总顺序相比,部分顺序是否足以构建堆?,c++,algorithm,stl,std,C++,Algorithm,Stl,Std,C++std::priority_队列只需要部分顺序。但是如果它的实现是一个二进制堆,它是如何工作的呢? 例如:假设我们有一个偏序集({a,b,c,x},{c代码>的要求是(C2+标准中的23.3.4),比较器定义严格的、弱的排序。后者在§25.4/4中定义如下: 术语“严格”指的是不可伸缩关系的要求(!comp(x,x)适用于所有x),术语“弱”指的是要求不如总排序的要求强,但比部分排序的要求强。如果我们把等价物(a,b)定义为!公司(a、b)和&!comp(b,a),那么要求comp和equ
({a,b,c,x},{c
,x
与a
,b
,c
无关。那么最大堆是:
layer 1: x
layer 2: b x
layer 3: x x a c
pop操作后,以教科书中常见的方式,即将根替换为c
,并将大小减小1。然后我们需要在下面的树的根上重分类:
layer 1: c
layer 2: b x
layer 3: x x a
我们将把
c
和b
交换为c
,对吗?然后呢?我们仍然没有有效的堆,因为b
。但是<代码> B <代码>不能“见”<代码> A<代码> < P>对<代码> PrimyIyQueQue>代码>的要求是(C++的标准的23.3.4),比较器定义了一个严格的、弱的排序。后者在§25.4/4中定义如下:
术语“严格”指的是不可伸缩关系的要求(!comp(x,x)适用于所有x),术语“弱”指的是要求不如总排序的要求强,但比部分排序的要求强。如果我们把等价物(a,b)定义为!公司(a、b)和&!comp(b,a),那么要求comp和equiv都是传递关系:
-comp(a,b)和comp(b,c)表示comp(a,c)
-等价(a,b)和等价(b,c)表示等价(a,c)[注:在这些条件下,可以证明
i) equiv是一种等价关系
ii)comp在由equiv确定的等价类上产生定义良好的关系
iii)诱导关系是一个严格的全序关系。-结束注]
换言之,比较器定义的关系不必是合计关系,但对于由假设关系equiv
定义的等价类而言,它必须是合计关系,该假设关系将所有元素定义为彼此不小于或大于的相等元素
<强>以更简单的术语表示,任何不被比较器关系覆盖的元素将被视为相等。> P>对<代码> PrimyIyQueQue>代码>的要求是(C2+标准中的23.3.4),比较器定义严格的、弱的排序。后者在§25.4/4中定义如下:
术语“严格”指的是不可伸缩关系的要求(!comp(x,x)适用于所有x),术语“弱”指的是要求不如总排序的要求强,但比部分排序的要求强。如果我们把等价物(a,b)定义为!公司(a、b)和&!comp(b,a),那么要求comp和equiv都是传递关系: -comp(a,b)和comp(b,c)表示comp(a,c) -等价(a,b)和等价(b,c)表示等价(a,c)[注:在这些条件下,可以证明 i) equiv是一种等价关系 ii)comp在由equiv确定的等价类上产生定义良好的关系 iii)诱导关系是一个严格的全序关系。-结束注] 换言之,比较器定义的关系不必是合计关系,但对于由假设关系equiv
定义的等价类而言,它必须是合计关系,该假设关系将所有元素定义为彼此不小于或大于的相等元素
更简单地说,比较器关系中未包含的任何元素都将被视为相等。是否有人提到
优先级队列
与偏序一起工作?不是吗?我不确定。怎么样std::sort
?我相信自己编写的快速排序可以支持偏序。虽然在几乎所有的实现中,std::sort
即使使用偏序也肯定会终止,但我非常怀疑结果会有多大用处。原因是它也假设了弱序,就像jogojapan在回答中描述的那样。使用偏序可以做的最合理的事情是。@MvG如何在std::sort()
中指定偏序?如果a不小于b
,它会自动假定a大于或等于b
。因此,在某种意义上,每个可能的对都是可比的。@MvG std::sort在偏序上定义不清,因为偏序不一定是严格的弱序,因为它可能会使不可比性的传递性失效:是否有人提到过priority\u queue
与偏序一起工作?不是吗?我不确定。怎么样std::sort
?我相信自己编写的快速排序可以支持偏序。虽然在几乎所有的实现中,std::sort
即使使用偏序也肯定会终止,但我非常怀疑结果会有多大用处。原因是它也假设了弱序,就像jogojapan在回答中描述的那样。使用偏序可以做的最合理的事情是。@MvG如何在std::sort()
中指定偏序?如果a不小于b
,它会自动假定a大于或等于b
。因此,从某种意义上说,每一对都是可比的。@MvG std::sort在偏序上定义不清,因为偏序不一定是严格的弱序,因为它可能会使不可比性的及物性失效:我不确定你所说的突出显示的句子是什么意思。代码将在所有元素上应用比较函数。不可能有比较器关系中未包含的元素。非常感谢!长期以来,我一直将“严格弱序”误解为“严格偏序”。顺便说一句,我仍然认为快速排序可以处理严格的偏序。@JamesKanze,“未覆盖”在这里意味着a
和b
都不是真的。对于弱序,这并不意味着a==b