我有一个超过一百万字的文件,每行一个字。我正在尝试编写代码,如果给我一个单词,我需要找出文件中是否存在该单词。这里的事情是,每个单词必须检查26^(word.length()-1)
次。因此,浏览文件中的每个单词都不是一个好的解决方案。我尝试在网上找到算法,但还没有找到任何明显的答案。
修改
我考虑过HashMap
和Trie
。这里的实际问题是我有abc
这个词。现在,我的任务是在单词abc
中添加,删除或替换一个字母以创建单词X,然后检查X是否在文件中。因此,对于哪种解决方案可能是更好的方法感到困惑。
答案 0 :(得分:7)
您可以根据文件中的字词构建trie。这将使用比Hashset少得多的内存,并允许您检查O中单词的存在(单词中的字符数)。如果内存不是问题,那么Hashset当然会这样做(因为它内置的功能也少得多)。
答案 1 :(得分:3)
将单词存储在内存中的HashSet中,您将进行O(1)查找。
答案 2 :(得分:1)
假设您的单词是“cad”,并且您希望找到编辑距离为1的所有单词。
在这种情况下,您可以执行以下操作。
1)将字典单词存储在HashMap中。 2)生成编辑距离为1到“cad”的所有单词组合。 3)对于每个单词,测试HashMap中是否存在该单词。
你的搜索应该匹配“爸爸”,“猫”,“汽车”,“小伙子”等字样。
答案 3 :(得分:0)
当你在文件中读到包含文字的文字时,我会建立一个哈希表。您应该能够在恒定时间内检查单词是否存在。
答案 4 :(得分:0)
HashMap是要走的路。只需将所有单词存储在HashMap中,然后查找地图以查看您的单词是否存在。当然,只有在需要多次查找时才有用。
更实际的解决方案是将HashMap写入磁盘并在下次运行应用程序时将其加载到内存中。
答案 5 :(得分:0)
tabla是更快的方式
FileInputStream inputStream = new FileInputStream("input.txt");
InputStreamReader streamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader in = new BufferedReader(streamReader);
Map<String, Integer> map = new HashMap<String, Integer>();
for (String s; (s = in.readLine()) != null;) {
...
}
答案 6 :(得分:0)
另一种解决方案是使用Bloom Filter。一种非常快速且节省空间的数据结构,用于检查元素是否是集合的成员。缺点是它是一种probalistic数据结构,这意味着可能存在误报。
通过使用m位数组来工作。当向过滤器添加单词时,该单词被赋予k个不同的散列函数,在这些散列计算的位置处将位设置为1。查询过滤器时,将字输入相同的散列并检查这些位是否设置在这些位置。如果这些位中的任何一个为0,则确定该字中不存在该字,如果全部为1则需要查找,因为在将其他字散列到相同位置时可能已设置这些位。