【发布时间】:2014-03-02 05:38:53
【问题描述】:
假设人们在 google 中搜索了 100 亿个单词。相应的 对于每个单词,您都有所有文档 ID 的排序列表。该列表如下所示:
[Word 1]->[doc_i1,doc_j1,.....]
[Word 2]->[doc_i2,doc_j2,.....]
...
...
...
[Word N]->[doc_in,doc_jn,.....]
我正在寻找一种算法来查找 100 个稀有词对。 稀有词对是一对同时出现(不一定连续)的词 正好 1 个文档。
如果可能的话,我正在寻找比 O(n^2) 更好的东西。
【问题讨论】:
-
复杂度必须也是文件数量的函数。您对文字和文档的复杂性要求是什么?
-
假设一个词可以出现的最大文档数是m,那么在O(2*m)最坏的情况下可以找到两个词的交集(两个词都存在的文档)。在这种情况下,可以在 O(n^2*m) 中找到单个稀有词对(蛮力)。我正在寻找比这更好的东西。
-
您可以轻松获得
O(d * w^2 * m),其中w是每个文档的最大字数,d是文档数。这样更好吗? -
@zvisofer:您可以使用散列得到
O(m)。并且对所有列表进行排序是O(n log m)甚至是使用整数排序的线性时间,因此如果需要,它很容易作为预处理步骤进行 -
@Microbotz:您枚举了
O(d)迭代中的所有文档。在每个文档中都有O(w)单词,因此您枚举O(w^2)中的所有对。现在,对于每一对,计算它们在O(m)中的文档列表的交集,以检查它们是否恰好出现一次。整个算法是O(d * w^2 * m),但在实践中,您可能会多次找到许多单词对。如果发生这种情况,您可以跳过相交部分并在许多情况下保存因子m。这是否优于原始算法很大程度上取决于您的数据。我看不出你从哪里得到O(d^2)。
标签: algorithm sorting set information-retrieval inverted-index