给k排序的反向列表,我想要一个有效的算法来获得这些k列表的并集? 每个反转列表是内存中的只读数组,每个列表按排序顺序包含整数。 结果将保存在足够大的预定义数组中。有没有比k-way合并更好的算法?
答案 0 :(得分:2)
K-Way合并是最佳选择。它有O(log(k)*n)
个操作符[其中n
是所有列表中元素的数量]。
很容易看出它不能做得更好 - 正如@jpalecek所提到的那样,否则你可以通过将它分成大小为1的块[倒排索引]来比O(nlogn)
更好地排序任何数组。
答案 1 :(得分:-1)
如果您不需要对结果数组进行排序,最好的方法是使用哈希表来标记您看到的元素。这样,您就可以获得O(n)
(n
是元素的总数)时间复杂度。
(Perl)的一些东西:
my %seen;
@merged = grep { exists $seen{$_} ? 0 : ($seen{$_} = 1) } (map {(@$_)} @inputs);