stl排序 - 严格的弱排序

时间:2009-08-18 11:13:05

标签: c++ algorithm stl strict-weak-ordering

为什么STL使用strict weak ordering的比较函数?为什么不能进行部分排序?

4 个答案:

答案 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)

您无法使用部分排序执行二进制搜索。您无法创建具有部分排序的二叉搜索树。 算法的哪些函数/数据类型需要排序,可以使用部分排序?