如何合并来自枚举器的数据是Scala

时间:2014-09-30 09:04:23

标签: scala playframework mergesort iterate

我正在使用Play框架中的enumerator / iteratee 我有几个枚举器,每个枚举器提供已排序的值序列。我想写Iteratee / Enumeratee,它合并来自这些枚举器的值,以提供所有值的排序序列。 使用Iteratee是一个好主意还是我应该直接实现enumeratee? 我知道我可以从枚举器中压缩值并在内存中重建它们的数据流,然后合并这些数据。

但我想知道是否有办法实现“经典”合并排序 - 从所有枚举器“读取”第一个值,然后选择最小值,然后让提供它的枚举器读取另一个值(同时其他普查员被搁置)。因此,我想要枚举,提供生成的排序序列,而不将所有流存储在内存中。我想遵循功能风格 - 保持一切不变。

感谢您的想法。

1 个答案:

答案 0 :(得分:0)

您仍需要在内存中的标准集合中进行一些插入排序。想象一下这个病态案例:

Enumerator(3, 2, 1) and Enumerator(4, -1 , -2, -3)

在这里,你不能只采取最小的元素,并在你的收藏结束时加以解决。您必须随时将值放在集合中的任意位置。这是从根本上进行排序O(n log(n))的一部分原因是你必须知道你需要排序的完整世界,以便更快地完成它。 (存储桶排序是一种线性时间排序算法,假设您知道要尝试排序的值的分布)

更具体地解决您的问题:

枚举器/ iteratee库对于您的用例并不具有足够的表现力。如果要合并枚举器,可以使用Enumerator.interleave并在Iteratee中对首先出现的任何元素进行一些插入排序。

如果这个机制对您很重要,您可以考虑使用最近发布的Akka Streams,您可以使用它来实现自定义FlexiMerge推/拉阶段,这样您就可以执行所需的操作。