Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与总顺序相比,部分顺序是否足以构建堆?_C++_Algorithm_Stl_Std - Fatal编程技术网

C++ 与总顺序相比,部分顺序是否足以构建堆?

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

C++std::priority_队列只需要部分顺序。但是如果它的实现是一个二进制堆,它是如何工作的呢? 例如:假设我们有一个偏序集
({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