为什么STL使用strict weak ordering的比较函数?为什么不能进行部分排序?
答案 0 :(得分:16)
partial order不足以实现某些算法,例如排序算法。由于部分有序集合不一定定义集合中所有元素之间的关系,您如何对部分顺序中没有订单关系的两个项目的列表进行排序?
答案 1 :(得分:11)
简单地说,严格的弱排序被定义为定义(可计算的)等价关系的排序。等价类按严格的弱排序排序:严格的弱排序是等价类的严格排序。
部分排序(不是严格的弱排序)没有定义等价关系,因此使用“等效元素”概念的任何规范对于不是严格弱排序的部分排序是没有意义的。 所有STL关联容器在某些时候都使用这个概念,所以所有这些规范都没有意义,部分排序不是严格的弱排序。
因为部分排序(不是严格的弱排序)不一定定义任何严格的排序,你不能根据部分排序在常识中“排序元素”(你所能做的就是“拓扑排序”,有较弱的属性)。
鉴于
S
<
S
x
S
您可以定义S
的分区(S
的每个元素都在L(x)
,I(x)
或G(x)
中:
L(x) = { y in S | y<x }
I(x) = { y in S | not(y<x) and not(x<y) }
G(x) = { y in S | x<y }
L(x) : set of elements less than x
I(x) : set of elements incomparable with x
G(x) : set of elements greater than x
对序列中的每个<
按照x
iff 对序列进行排序,L(x)
的元素首先出现在序列中,然后是元素I(x)
,后跟G(x)
的元素。
对于序列中另一个元素y
之后出现的每个元素x
,序列在拓扑上排序 iff ,y
不小于{{1 }}。这是一个比排序更弱的约束。
证明x
的每个元素都小于L(x)
的任何元素都是微不足道的。 G(x)
的元素与L(x)
的元素之间,或I(x)
的元素与I(x)
的元素之间没有一般关系。但是,如果G(x)
是严格的弱排序,则<
的每个元素都小于L(x)
的任何元素,并且I(x)
的任何元素都小于任何元素I(x)
。
如果G(x)
是严格的弱排序,<
那么x<y
的任何元素都少于任何元素L(x) U I(x)
:任何元素都不大于I(y) U G(y)
}小于任何不小于x
的元素。 这不一定适用于部分订购。
答案 2 :(得分:6)
引用here给出的答案:
因为在内部,这些算法实现&#34;等于&#34;为
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> <li> <label> <input class="calc" type="radio" name="rad1" id="rad1" value="100" /> </label> </li> <li> <label> <input class="calc" type="checkbox" name="check1" id="check1" value="200" /> </label> </li> <input type="hidden" name="sum" id="sum" value="0"> <p>Total: PHP <span id="price">0</span> </p>
。如果您使用
!(a < b) && !(b < a)
来实现less-than运算符,那么就是上面的 在<=
时会返回false。破坏的平等检查会搞砸 几乎任何算法。同样,他们实施&#34;不等于&#34;作为
a == b
,再次,如果您使用(a < b) || (b < a)
实施<
运算符,那么它 当它们彼此相等时,它们将返回true,实际上它们是相同的 不平等。因此,平等检查在两个方向都被打破了。将库限制为小于运算符的重点是 所有逻辑运算符都可以用它来实现:
<=
:<(a, b)
(a < b)
:<=(a, b)
!(b < a)
:==(a, b)
!(a < b) && !(b < a)
:!=(a, b)
(a < b) || (b < a)
:>(a, b)
(b < a)
:>=(a, b)
只要您提供的运营商符合a的条件,这就有效 严格的弱序。标准的
!(a < b)
和<=
运营商没有。
答案 3 :(得分:5)
您无法使用部分排序执行二进制搜索。您无法创建具有部分排序的二叉搜索树。 算法的哪些函数/数据类型需要排序,可以使用部分排序?