在巨大的列表中查找热门关键字

时间:2010-11-12 20:00:46

标签: algorithm popularity

我有一个巨大的列表,大约有10万行,如下所示:

  • ipadnews
  • abcipad
  • cddeeffipad
  • 地狱世界
  • iworldthis ..等等

并希望找到受欢迎的子串,在这种情况下,“ipad”将是最受欢迎的,“世界”将位于第二位。最小长度应为三或四个字符。

我无法预测子字符串,所以使用字典是不行的。

3 个答案:

答案 0 :(得分:4)

这是一个相对复杂的问题......但它使用前缀/后缀树是易处理的。它本质上是longest common subsequencelongest common substring问题的变体。 - 这是我要开始的地方。

此表单上的问题实际上已经a bit of research了 - 您应该可以使用上述条款来缩小搜索范围。

答案 1 :(得分:2)

您可以使用generalized suffix tree来解决此问题,LCS problem可以在O(n)时间内构建。这实际上是{{3}}上的一个游戏。

答案 2 :(得分:0)

我会使用以下逻辑流程来解决这个问题:

  1. 提取每个单词的后缀集。因此,从'ipadnews'我们得到:'ipadnews','padnews','adnews'等等。这样,“新闻”将成为后缀之一,但不是“ipad”。

  2. 要弥补上述步骤中缺失的子字符串,也要提取前缀。我们得到'ipadnew','ipadne'等等,包括'ipad'。

  3. 对于上面的每个子字符串,将它们哈希到一个计数,例如$哈希{$ SUBSTR} ++

  4. 最后,我们将有一个长哈希表,其中单词的频率为值。而不是昂贵的排序,假设你只想要10个最流行的单词。从头开始保留一组,其标准是其中的任何单词必须具有高于当前最低分数的分数。您可以使用最低分数跟踪单词,当您添加分数高于最低分数的第11项时,使用最低分数突破该单词并更新最小分数指针。

    哈希表中的最大键数为2 * k * n,其中k是单词的平均长度,n是单词的总数。