我正在寻找一种算法来合并多个排序的序列,比如说将具有n个元素的X个排序的序列合并到c ++中的一个排序的序列中,您能提供一些示例吗?
注意:我不想使用任何库
可以使用三种方法进行合并:
假设您正在m lists与n elements each
m lists
n elements each
算法1:-
合并一次列出两个。使用合并排序之类的合并例程,以在对列表进行排序时进行合并。没有任何库,实现起来非常简单。但是O(m^2*n),如果m不大,则需要足够小的时间。
O(m^2*n)
算法2:-
这是对1的改进。在这里,我们总是合并列表,而列表是其余列表中最小的两个。使用a priority queue来做到这一点,并选择最小的两个列表并将其合并,然后将新列表添加到队列中。这样做直到只剩下一个列表,这就是您的答案。此技术用于huffman coding生产optimal merge pattern。这需要O(m*n*logm)。此外,对于大小相似的列表,可以进行parallel选择,因为我们可以选择一对列表并进行并行合并。假设您有m processors算法可以理想地运行O(n*logm)而不是O(m*n*logm)
priority queue
huffman coding
optimal merge pattern
O(m*n*logm)
parallel
m processors
O(n*logm)
算法3:-
这是最有效的算法,其中您priority queue为所有列表的第一个元素维护a 并提取min以获取新元素,还维护列表min元素所属的索引,以便您可以从该列表中添加下一个元素。这取O(s*logm)s是所有列表中的总元素。
O(s*logm)