在大文本中查找短语的最佳算法

时间:2016-02-17 12:31:41

标签: java string algorithm text

假设我们有一个大约等于(1 GB)的巨大文本,例如我将从中获取此样本:

  Stack Overflow是一个私营网站,是Stack Exchange Network的旗舰网站,由Jeff Atwood和Joel Spolsky于2008年创建。它被创建为更早开放的替代早期Q& A站点,如Experts-Exchange。

然后我需要为搜索 Iwc 提供此文本给我结果:**它已创建**。

所以我的想法是在那个巨大的文本中找到那些短语 第一个字以我开头, 第二个单词以w 开头 第三个单词以c 开头,为我提供结果

算法应该尽可能快地得到结果,我们应该关心从内存中花费多少。

最好的算法是什么,或者最好的做法。

2 个答案:

答案 0 :(得分:5)

你要求最好的"算法。我可以想到" best"的以下定义:

  1. 实施最快
  2. 在给定足够内存的情况下运行一次(运行时间最短)
  3. 内存占用最少
  4. 最快运行大量查询,以便每个额外的查询都需要最少的时间
  5. 上述一个或多个之间的妥协
  6. 每个人都有不同的解决方案。例如,解决 2) 3),您无法编写一个小型状态机,通过工作读取输入字,跟踪如何远远没有找到一个完整的匹配。复杂性将是O(totalWordCount)

    解决 4)更有趣 - 您必须构建一个有效的索引并在该索引中查找。然后,深度限制的Trie结构将是最佳的,因为复杂性将是O(queryWordCount),其是<< O(totalWordCount)。但是,构建索引的成本很高(虽然固定深度的O(totalWordCount)是线性的),并且会使这对 2)的方法很糟糕。

    最后,https://codegolf.stackexchange.com/的人们会告诉您最小化 6)代码中字符数量的乐趣。

    扩展基于Trie的解决方案:

    • 首先建立一个特里。将单词首字母存储为节点标签,并将与每个节点关联的ArrayList<Integer>与偏移量相关联,以便在文本中找到具有这些初始序列的单词。为了控制索引大小和构建时间,您需要将trie限制为给定深度(深度为5 trie只允许您查找长度为5或更短的首字母序列)。最大深度为5,我估计索引大小将与您的文本类似 - 因此请确保有足够的RAM可用。
    • 搜索只是从根节点开始走路节点,直到您找不到所需的下一个节点(该顺序中的首字母没有出现在文本中)或者您已经走到了首字母的末尾。在第二种情况下,arraylist的内容是可以找到初始化单词的文本的偏移量,按正确的顺序排列。

答案 1 :(得分:0)

我对算法一无所知,但对于一个简单的解决方案,我使用StringTokenizer,用空格分隔,如果stringTokenizer.nextToken()返回一个以字母开头的字符串你& #39;重新寻找,检查下一个stringTokenizer.nextToken()调用的结果,等等