此问题与以下问题有关:
我的问题是:
方案:
我在这个集合中有一组numbers
,EACH 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
的答案是直截了当且易于实现的(并且按时具有良好的性能)
答案 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是作为输出生成的总位数。
希望这有帮助!