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

Java 合并多个流并写入已排序的输出流,java,algorithm,data-structures,linked-list,Java,Algorithm,Data Structures,Linked List,我最近在几次采访中偶然发现了这个问题。具体如下: final class Stream { public interface boolean isClosed(); public interface int read(); } // utility method to write numbers to consumer stream public void write(Integer number); 您有一个可以异步读取的数字流列表。给定消费者的写入流,您将如何从这些流中读取数

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

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

// utility method to write numbers to consumer stream
public void write(Integer number);
您有一个可以异步读取的数字流列表。给定消费者的写入流,您将如何从这些流中读取数字,合并并排序它们,最后写入输出流

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);
我对这个问题的最初想法是,它类似于。但是,这有两个问题:

  • 如何合并和维护读取流的顺序和同步
  • 你如何确保数字写得毫不拖延?因为一旦执行了写入,就不能再确保流中任何其他数字的写入顺序

我相信这里有一个警告,我已经误解或完全遗漏了。这方面的任何帮助都会很好。谢谢。

我假设有很多流,每个流都以递增的顺序提供数据

现在您的流接口有一个小问题。您可以在此基础上构建一个由成对的
(lastValue,stream)
组成的类,该类具有方法
peek
(返回
lastValue
)和
readNext
(如果
stream.isClosed()
返回
null
,否则返回成对的
(stream.read(),stream)
。还有一件事,我们可以添加一个
compareTo
方法,该方法首先比较
lastValue
,然后比较
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
从流构造初始对
将它们放入名为pq的优先级队列中
而0

如果
n
是流之间的数据总量,
m
是流的数量,则此算法将花费时间
O(n log(m)+m)
+m
位仅在您从大量关闭的流开始时显示。

流中的数字是否严格递增?根据您对问题文本的措辞方式,您不能假设输入流已排序,即使示例数据恰好以升序出现,因此您必须读取所有data。鉴于这似乎不太可能,考虑到文本的其余部分,要么你错误地引用了挑战,要么你在面试中被要求提出澄清问题,表明你能够正确识别和处理不完整的需求(这在现实生活中太常见了)。肯定需要更多信息,但我最初的想法是,这个问题与@user7相似。对于这种情况,是的,数字正在严格增加