【问题标题】:Lazy Quicksort in ScalaScala中的惰性快速排序
【发布时间】:2011-02-11 01:40:52
【问题描述】:

是否可以在 Scala 中做 this 之类的事情?

【问题讨论】:

  • 恕我直言,问题应该是自包含的。更多细节的链接是可以的,但在这里引用两行haskell-code不会太多工作。

标签: scala lazy-evaluation quicksort


【解决方案1】:

是的!

Scala 支持“惰性 vals”作为一种将值的计算推迟到实际使用的方法。 Scala 2.8 库的大部分内容都能够处理延迟定义的集合。

【讨论】:

  • 这没有回答所提出的问题。
【解决方案2】:
def quicksort[A](xs: Stream[A])(implicit o: Ordering[A]): Stream[A] = {
  import o._ 
  if (xs.isEmpty) xs else {
      val (smaller, bigger) = xs.tail.partition(_ < xs.head)
      quicksort(smaller) #::: xs.head #:: quicksort(bigger)
  }
}

它也可以用视图来完成,虽然它肯定会慢得多:

def quicksort[A](xs: List[A])(implicit o: Ordering[A]) = {
  import o._
  def qs(xs: SeqView[A, List[A]]): SeqView[A, Seq[_]] = if (xs.isEmpty) xs else {
    val (smaller, bigger) = xs.tail.partition(_ < xs.head)
    qs(smaller) ++ (xs.head +: qs(bigger))
  }
  qs(xs.view)
}

【讨论】:

  • 谢谢,但我也想看看列表视图的实现。
  • @Mahesh 视图实现比我最初想象的要难。我会继续尝试看看是否有效果。
  • @Mahesh 好的,问题解决了。我忘记了串联线上的.head……真傻。
  • @Daniel:我们可以用quicksort[A &lt;% Ordering[A]](xs: List[A]) = {替换第一行吗?
  • 为什么这种惰性排序(或类似的东西)不是用于 Stream.scala(和 SeqView?)中的 sortedsortBysortWith 等的实现。或者是吗?有没有办法只使用库内置函数来懒惰地排序? sorted 不是“变形金刚”吗?文档说 Stream “懒惰地实现了它所有的转换器方法”,但据我所知,这里的情况似乎并非如此?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2016-05-05
  • 2022-01-05
  • 2021-06-14
  • 2017-01-26
相关资源
最近更新 更多