倒排列表联盟

时间:2012-02-26 15:08:02

标签: algorithm search-engine information-retrieval inverted-index

给k排序的反向列表,我想要一个有效的算法来获得这些k列表的并集? 每个反转列表是内存中的只读数组,每个列表按排序顺序包含整数。 结果将保存在足够大的预定义数组中。有没有比k-way合并更好的算法?

2 个答案:

答案 0 :(得分:2)

K-Way合并是最佳选择。它有O(log(k)*n)个操作符[其中n是所有列表中元素的数量]。

很容易看出它不能做得更好 - 正如@jpalecek所提到的那样,否则你可以通过将它分成大小为1的块[倒排索引]来比O(nlogn)更好地排序任何数组。

  • 注意:这个答案假设倒排索引很重要 [结果数组]将被排序。对大多数人来说这种假设是正确 使用倒排索引的应用程序,尤其是在 信息检索区域。此功能[已排序的索引]允许 优雅而快速的索引交叉。
  • 注意:标准的k-way合并允许重复,你必须这样做 确保如果一个元素出现在两个列表中,它将是 只添加一次[通过简单地检查最后一个元素很容易做到 添加前的目标数组]。

答案 1 :(得分:-1)

如果您不需要对结果数组进行排序,最好的方法是使用哈希表来标记您看到的元素。这样,您就可以获得O(n)n是元素的总数)时间复杂度。

(Perl)的一些东西:

my %seen;
@merged = grep { exists $seen{$_} ? 0 : ($seen{$_} = 1) } (map {(@$_)} @inputs);