查找集合中最常见的数字组合

时间:2014-09-02 17:13:37

标签: algorithm search set combinations

此问题与以下问题有关:

  

How to find most frequent combinations of numbers in a list

     

Most frequently occurring combinations

我的问题是:

方案: 我在这个集合中有一组numbersEACH COMBINATION IS UNIQUE,并且组合中的每个数字只出现一次:

目标: 在此集合中找出组合出现的频率(大小为2)。

示例:

频率阈值为2。

Set = {1,12,13,134,135,235,2345,12345}

2组合度的频率是(显示出现超过2次的所有组合):

  

13 - 出现4次

     

14 - 出现3次

     

23 - 出现3次

     

12 - 出现2次

     

...

详尽搜索所有可能组合的时间复杂性呈指数级增长。

任何人都可以帮我思考一个可以更快解决这个问题的算法吗? (哈希表,XOR,树搜索....)

谢谢

PS。 不要担心空间复杂性

解决方案和结论:

templatetypedef的回答有利于子字符串'长度超过3

如果子字符串的长度为2,则btilly的答案是直截了当且易于实现的(并且按时具有良好的性能)

2 个答案:

答案 0 :(得分:2)

这是伪代码,其运行时间应为O(n * m * m),其中n是集合的大小,m是该集合中事物的大小:

let counts be a hash mapping a pair of characters to a count
foreach number N in list:
    foreach pair P of characters in N:
        if exists counts[P]:
            counts[P] = counts[P] + 1
        else:
            counts[P] = 1
 let final be an array of (pair, count)
 foreach P in keys of counts:
     if 1 < counts[P]:
         add (P, counts[P]) to final
 sort final according to the counts
 output final
如果您正在寻找3,4,等人物角色的组合,那么@ templatetypedef的答案最终会更有效率。但对于所述问题,这应该没问题。

答案 1 :(得分:1)

您可以将此问题视为字符串问题:给定字符串集合,返回至少出现k次的集合的所有子字符串。幸运的是,这个问题的多项式时间算法使用了广义后缀树。

首先为数字的字符串表示构建一个通用后缀树,这需要所有数字的位数线性时间。然后,执行DFS并使用其子树中的叶节点数来注释每个节点(等效地,节点表示的字符串出现在输入集中的次数),并且在这样做的过程中输出每个字符串发现此出现至少k次的方式。此操作的运行时为O(d + z),其中d是输入中的总位数,z是作为输出生成的总位数。

希望这有帮助!