我最近在几次采访中偶然发现了这个问题。内容如下:
您有一个可以异步读取的数字流列表。给消费者一个写流,您将如何从这些流中读取数字,对其进行合并和排序,最后写入输出流?
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。但是,这有两个问题:
我确信这里有一个警告,我完全误解了或完全漏掉了。任何帮助都会很棒。谢谢。
答案 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)
位才会显示。