假设我们有一个大约等于(1 GB)的巨大文本,例如我将从中获取此样本:
Stack Overflow是一个私营网站,是Stack Exchange Network的旗舰网站,由Jeff Atwood和Joel Spolsky于2008年创建。它被创建为更早开放的替代早期Q& A站点,如Experts-Exchange。
然后我需要为搜索 Iwc 提供此文本给我结果:**它已创建**。
所以我的想法是在那个巨大的文本中找到那些短语 第一个字以我开头, 第二个单词以w 开头 第三个单词以c 开头,为我提供结果
算法应该尽可能快地得到结果,我们应该关心从内存中花费多少。
最好的算法是什么,或者最好的做法。
答案 0 :(得分:5)
你要求最好的"算法。我可以想到" best"的以下定义:
每个人都有不同的解决方案。例如,解决 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可用。答案 1 :(得分:0)
我对算法一无所知,但对于一个简单的解决方案,我使用StringTokenizer,用空格分隔,如果stringTokenizer.nextToken()返回一个以字母开头的字符串你& #39;重新寻找,检查下一个stringTokenizer.nextToken()调用的结果,等等