有效地搜索各行中的数字对

时间:2017-11-20 20:22:42

标签: algorithm optimization graph

想象一下,你有N个不同的人,并且你有这些人在哪里的记录,确切地说这些记录中的M个。

例如

1,50,299
1,2,3,4,5,50,287
1,50,299

所以你可以看到'人1'与'人50'在同一个地方三次。这里M = 3,因为只有3行。我的问题是给出了这些行中的M个,并且一个阈值(即人A和B在同一个地方的时间超过了阈值时间),你有什么建议以最有效的方式返回这些共生点?

到目前为止,我已经构建了一个N by N表,并且每行循环,每次N co出现连续M时递增表(N,M)。显然这是一个糟糕的方法,取决于你的实现方式,取0(n ^ 2)到O(n ^ 3)。任何提示将不胜感激!

3 个答案:

答案 0 :(得分:1)

无需创建表格。只需创建一个哈希/字典/无论你的语言是什么。然后是伪代码:

answer = []
for S in sets:
    for (i, j) in pairs from S:
        count[(i,j)]++
        if threshold == count[(i,j)]:
            answer.append((i,j))

如果您有M个尺寸为K的尺寸,则运行时间为O(M*K^2)

如果您愿意,实际上可以在与count平行的数据结构中保留相交集的列表而不更改big-O。

此外,可以使用map-reduce以分布式方式容易地实现相同的算法。对于计数,您只需要发出(i, j)的密钥和1的值。在减少你的数量。实际上生成集合列表是类似的。

答案 1 :(得分:0)

您案例的已知概念是Market Basket分析。在这种情况下,有不同的算法。例如Apriori algorithm可以在特定情况下用于大小为2的集合。

此外,在这些情况下,使用LSH和min-hash查找具有特定支持和条件(对于您的情况是阈值)的association rules

答案 2 :(得分:0)

您可以使用概率加快速度,例如只检查每对的概率为1/50。这将为您提供50倍的加速。然后仔细检查任何使它足够接近M的1/50的对。

要仔细检查任何对,您可以再次浏览整个列表,或者如果您执行一些聪明的反向索引,则可以更有效地进行双重检查。例如将每个人的行索引编码为64位整数,您可以使用二进制搜索/合并排序类型技术来查看要比较的64位整数,并使用位操作来比较64位整数的匹配。要查找的其他内容可能是反向索引,二进制索引范围树/ fenwick树。