Algorithm 在庞大的列表中查找流行关键字

Algorithm 在庞大的列表中查找流行关键字,algorithm,popularity,Algorithm,Popularity,我有一个巨大的列表,大约有10万行,如下所示: ipadnews 阿布西帕德 cddeeffipad 地狱世界 我知道这个 .. 等等 如果想要找到流行的子字符串,那么“ipad”将是最流行的,而“world”将排在第二位。最小长度应为三个或四个字符 我无法预测子字符串,所以使用字典是不行的。这是一个相对复杂的问题。。。但是使用前缀/后缀树是可以处理的。它本质上是一个变化的和问题这就是我要开始的地方 实际上,这个表单上有很多问题-您应该能够使用上面的术语来缩小搜索范围。这是一个相对复杂的问题

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

  • ipadnews
  • 阿布西帕德
  • cddeeffipad
  • 地狱世界
  • 我知道这个 .. 等等
如果想要找到流行的子字符串,那么“ipad”将是最流行的,而“world”将排在第二位。最小长度应为三个或四个字符


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

这是一个相对复杂的问题。。。但是使用前缀/后缀树是可以处理的。它本质上是一个变化的和问题这就是我要开始的地方


实际上,这个表单上有很多问题-您应该能够使用上面的术语来缩小搜索范围。

这是一个相对复杂的问题。。。但是使用前缀/后缀树是可以处理的。它本质上是一个变化的和问题这就是我要开始的地方


这个表单上实际上有很多问题-你应该能够使用上面的术语来缩小搜索范围。

你可以使用一个可以在
O(n)
时间内构建的。这实际上是一个游戏。

您可以使用内置的
O(n)
时间解决此问题。这实际上是一个游戏。

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

  • 提取每个单词的后缀集。所以从“ipadnews”我们可以得到:“ipadnews”,“padnews”,“adnews”,等等。这样,“新闻”将成为后缀之一,而不是“ipad”

  • 为了弥补上述步骤中缺少的子字符串,还需要提取前缀。我们有“ipadnew”、“ipadne”等等,包括“ipad”

  • 对于上面的每个子字符串,将它们按计数进行散列,例如$hash{$substr}++

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


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

    我将使用以下逻辑流来解决此问题:

  • 提取每个单词的后缀集。所以从“ipadnews”我们可以得到:“ipadnews”,“padnews”,“adnews”,等等。这样,“新闻”将成为后缀之一,而不是“ipad”

  • 为了弥补上述步骤中缺少的子字符串,还需要提取前缀。我们有“ipadnew”、“ipadne”等等,包括“ipad”

  • 对于上面的每个子字符串,将它们按计数进行散列,例如$hash{$substr}++

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


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

    子字符串本身不是“关键字”。那么关键字是什么?在列表中找到单词的任何子字符串?听起来确实是这样。。。这真是太复杂了算法怎么知道“world”是一个可以接受的关键字,但现在是“worl”还是“orld”?@Wooble,@Playcat:说得好!应该是子字符串而不是关键字。Thanks@Axn:在匹配常用子字符串之前,您不知道子字符串本身不是“关键字”。那么关键字是什么?在列表中找到单词的任何子字符串?听起来确实是这样。。。这真是太复杂了算法怎么知道“world”是一个可以接受的关键字,但现在是“worl”还是“orld”?@Wooble,@Playcat:说得好!应该是子字符串而不是关键字。Thanks@Axn:在对流行子字符串进行匹配之前,您不会知道这在“iworldthis”中找不到“world”,OP似乎期待着这样的结果。可能需要从后缀集的每个元素中提取前缀集?这在“iworldthis”中找不到“world”,而OP似乎期望这样。可能需要从后缀集的每个元素中提取前缀集?