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