【问题标题】:stl ordering - strict weak orderingstl ordering - 严格的弱排序
【发布时间】:2010-11-20 13:31:26
【问题描述】:

为什么 STL 可以使用 strict weak ordering 的比较函数?为什么不能是偏序?

【问题讨论】:

  • 你不能澄清一下展示样本是什么意思吗?

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


【解决方案1】:

partial order 不足以实现某些算法,例如排序算法。由于偏序集合不一定定义集合的所有元素之间的关系,那么您将如何对在偏序内没有顺序关系的两个项目的列表进行排序?

【讨论】:

  • "部分有序集合不一定定义集合的所有元素之间的关系"严格的弱排序并不好,它并不总是使一个元素小于或大于比另一个。
【解决方案2】:

简单地说,严格的弱排序被定义为定义(可计算的)等价关系的排序。等价类按严格弱序排序:严格弱序是对等价类的严格排序

偏序(不是严格的弱序)没有定义等价关系,所以任何使用“等价元素”概念的规范对于非严格弱序的偏序都是没有意义的。 所有 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

一个序列按照&lt;排序 iff 对于序列中的每个xL(x)的元素在序列中首先出现,然后是I(x)的元素,然后是G(x) 的元素。

对于序列中出现在另一个元素x 之后的每个元素y,对序列进行拓扑排序iffy 不小于x。这是一个比排序更弱的约束。

证明L(x) 的每个元素都小于G(x) 的任何元素是微不足道的。 L(x) 的元素与I(x) 的元素之间或I(x) 的元素与G(x) 的元素之间没有一般关系。但是,如果&lt; 是严格的弱排序,则L(x) 的每个元素都小于I(x) 的任何元素,并且I(x) 的任何元素都小于G(x) 的任何元素。

如果&lt; 是严格的弱排序,并且x&lt;yL(x) U I(x) 的任何元素都小于I(y) U G(y) 的任何元素:不大于x 的任何元素小于不小于@ 的任何元素987654357@。 这不一定适用于部分排序。

【讨论】:

  • 那么实际上严格的弱排序确实隐含地定义了等价关系?假设如果 I(x)
  • @zoujyjs I(x) 是一个集合(S 的一部分); I(x) &lt; x 的意思是:对于每个 y,这是 I(x)y &lt; x 的一个元素?如果是这样,not(x &lt; E) and not(E &lt; x)(其中xS 的一个元素,ES 的一部分)并不意味着E = {x}
  • 第一段可能需要一些工作。我不认为“排序”这个词有一个普遍同意的定义,所以也许改为说“严格的部分排序”......但前提是你真正的意思是(我实际上不确定)。目前还不清楚如何定义等价关系。而且我认为“(可计算的)”在这里没有任何意义。因此,建议重写第一句:“简单地说,严格的弱排序可以定义为严格的偏序 如果就是你的意思。
  • 哼...我的回答在措辞上有严重问题!我现在很惭愧。答案确实需要编辑。
  • "我认为“(可计算的)”在这里没有任何意义。” 在 STL 的上下文中,关系不仅仅是一种数学关系。数学上定义明确但您无法计算的关系是无用的。在 STL 的上下文中,关系是返回布尔值和数学关系的 C++ 函数(或函子),并且 C++ 函数必须返回一个值(不是循环,不是调用退出)并且返回的值必须是 true iff 关系成立。
【解决方案3】:

引用here给出的答案:

因为在内部,这些算法将“等于”实现为!(a &lt; b) &amp;&amp; !(b &lt; a)

如果你使用&lt;=来实现小于运算符,那么上面 当a == b 时将返回 false。被破坏的平等检查会搞砸 几乎任何算法。

同样,他们将“不等于”实现为(a &lt; b) || (b &lt; a) ,再一次,如果您使用&lt;= 实现了&lt; 运算符,那么它 当它们彼此相等时将返回 true,而实际上它们 不相等。所以相等性检查在两个方向上都被破坏了。

将库限制为小于运算符的全部意义在于 所有的逻辑运算符都可以用它来实现:

  • &lt;(a, b): (a &lt; b)
  • &lt;=(a, b): !(b &lt; a)
  • ==(a, b): !(a &lt; b) &amp;&amp; !(b &lt; a)
  • !=(a, b): (a &lt; b) || (b &lt; a)
  • &gt;(a, b): (b &lt; a)
  • &gt;=(a, b): !(a &lt; b)

只要您提供的运算符满足 严格的弱排序。标准的&lt;=&gt;= 运算符不支持。

【讨论】:

    【解决方案4】:

    您不能使用偏序执行二分查找。您不能创建具有偏序的二叉搜索树。 算法中的哪些函数/数据类型需要排序并且可以使用部分排序?

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 2013-02-14
      • 2013-05-25
      • 2016-02-04
      • 1970-01-01
      • 2019-06-09
      • 2015-09-20
      • 2010-11-02
      • 1970-01-01
      相关资源
      最近更新 更多