2

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

但我想知道是否有办法实现“经典”合并排序 - 从所有枚举器中“读取”第一个值,然后选择最小值,然后让提供它的枚举器读取另一个值(而其他枚举器是等候接听)。因此,我希望 enumeratee 提供结果排序序列,而不将所有流存储在内存中。而且我想遵循功能风格 - 保持一切不可变。

感谢您的想法。

4

1 回答 1

0

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

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

在这里,您不能只取最小的元素并将其粘贴在您的收藏品的末尾。您将不得不在集合中的任意位置放置值。这是使排序从根本O(n log(n))上说的一部分,即您必须了解您必须排序的全部内容,以便比这更快地完成排序。(桶排序是一种线性时间排序算法,假设您知道要排序的值的分布)


为了更具体地解决您的问题:

enumerator/iteratee 库对于您的用例来说并没有足够的表现力。如果你想合并枚举器,你可以使用Enumerator.interleave并在你Iteratee的任何元素中进行一些插入排序。

如果这个机制对你很重要,你可以考虑使用最近发布的Akka Streams,你可以使用它来实现一个自定义的FlexiMerge推/拉阶段,让你做你想做的事。

于 2015-08-05T02:16:13.690 回答