【问题标题】:How to order a collection with PartialOrdering?如何使用 PartialOrdering 订购收藏品?
【发布时间】:2014-09-21 20:22:44
【问题描述】:

我需要订购一组信封。每个信封都用它的高度和宽度来描述。如果信封 1 可以插入信封 2,则信封 1 小于信封 2。如果信封1无法插入信封2,反之亦然,则无法进行比较。

如何在 scala 中订购这些信封?我在互联网上找不到任何相关信息。

这是我的一些代码:

object EnvelopeOrdering extends PartialOrdering[(Int, Int)] {
  override def tryCompare(x: (Int, Int), y: (Int, Int)): Option[Int] = {
    if (x._1 < y._1 && x._2 < y._2) return Some(1)
    if (x._1 > y._1 && x._2 > y._2) return Some(-1)
    if (x._1 == y._1 && x._2 == y._2) return Some(0)
    None
  }

  override def lteq(x: (Int, Int), y: (Int, Int)): Boolean = x._1 < y._1 && x._2 < y._2
}

【问题讨论】:

  • 这不是一个简单的排序问题。这个问题可能是相关的:math.stackexchange.com/questions/55891/…
  • gist.github.com/ThiporKong/4399695 之类的东西应该可以帮助您入门。当然,您首先有一个 O(N^2) 步骤来获取索引对,但如果事实证明有必要,您可以随时进行优化。
  • Box stacking problem的可能重复
  • 为什么不把部分顺序扩展到不矛盾的全顺序呢?除非您要求排序稳定(这是经典排序问题中的一项重要要求),否则无需使用“部分排序感知”的自定义排序算法即可获得结果。
  • 我不明白你想做什么。能举个例子吗?

标签: algorithm scala sorting partial-ordering


【解决方案1】:

您感兴趣的是topological sort,并且有一个经典算法可以按照边数的顺序以复杂度来执行它。在您的情况下,当且仅当第一个信封较小时,您将在两个信封之间有一条边缘(并且边缘应该从较小的指向较大的那个)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2017-01-29
    • 2019-05-29
    • 2020-09-19
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多