合并排序的无限流

时间:2018-03-19 20:01:11

标签: scala stream

给定有限数量的有序无限流。如何将这些流合并为单个排序的无限流? e.g。

def merge[T](ss: List[Stream[T]]): Stream[T]

3 个答案:

答案 0 :(得分:4)

你可以做这样的事情

def merge[T: Ordering](ss: List[Stream[T]]): Stream[T] = {
    val str = ss.minBy(_.head)
    val (containsMin, rest) = ss.partition(_.head == str.head)
    containsMin.map(_.head).toStream #::: merge(containsMin.map(_.tail) ++ rest)
  }

这将从较小到较大,并假设流以相同的方式排序

答案 1 :(得分:1)

创建一个支持无限流的签名的方法是不可能的。由于原始流的所有元素在执行期间都在范围内,因此内存不足。 请阅读本文以获取解释http://blog.dmitryleskov.com/programming/scala/stream-hygiene-i-avoiding-memory-leaks/

答案 2 :(得分:0)

排序位可能不相关,因为能够排序您需要严格评估流(然后Stream不是您想要的类型)。但你可以保持"命令"评估元素的位置。

我可能会尝试这样的事情:

 Starting 'watch'...
 Finished 'watch' after 7.99 ms