合并多个流并写入排序的输出流

时间:2019-06-04 17:21:05

标签: java algorithm data-structures linked-list

我最近在几次采访中偶然发现了这个问题。内容如下:

您有一个可以异步读取的数字流列表。给消费者一个写流,您将如何从这些流中读取数字,对其进行合并和排序,最后写入输出流?

Input:

 1. stream 1: 1, 2, 3, 4...
 2. stream 2: 1, 2, 3, 4, 5...

Output: 1, 1, 2, 2, 3, 3, 4, 4, 5....

我们可以假定合同如下:

final class Stream {
   public interface boolean isClosed();
   public interface int read();
}

// utility method to write numbers to consumer stream
public void write(Integer number);

我最初对这个问题的想法是,它类似于LRU cache buffer。但是,这有两个问题:

  • 如何合并和维护读取流的顺序和同步?
  • 您如何确保数字被立即写入?一旦执行了写操作,就无法再确保流中任何其他数字的写顺序了?

我确信这里有一个警告,我完全误解了或完全漏掉了。任何帮助都会很棒。谢谢。

1 个答案:

答案 0 :(得分:1)

我将假设有许多流,并且每个流都以递增的顺序提供数据。

现在您的流接口有一个小问题。您可以在该类的基础上构建一个类,该类由成对的(lastValue, stream)和一对peek(返回lastValue)和readNext(如果stream.isClosed()返回{{ 1}},否则返回对null。此外,我们可以添加一个(stream.read(), stream)方法,该方法首先比较compareTo,然后比较lastValue

这些对买给我们的是,我们可以将它们放在PriorityQueue中。这使我们可以实现类似以下逻辑的东西:

stream.hashCode()

如果construct initial pairs from streams put them into a priority queue named pq while 0 < pq.size() take the smallest pair p print p.peek() pNext = p.readNext() if pNext != null add pNext to pq 是流之间的数据总量,而n是流的数量,则此算法将花费时间m。仅当您从关闭的许多流开始时,O(n log(m) + m)位才会显示。