我必须在Java程序中存储大量单词(+ 200k),我想快速访问它们。
我只需要知道一个给定的单词是否属于我的“字典”。我不需要像<word, smthg>
那样的对。
如果可能的话,我正在标准库中搜索解决方案。
PS:也许使用数据结构不是更好的方法吗?每次包含单词的文件读取效率会更高吗?
编辑:这是一个小项目。我必须处理有效性和记忆
最后编辑:我最终选择了HashSet。
答案 0 :(得分:5)
使用java集因为集合是像TreeSet这样的线性排序数据结构。因此,对于搜索,可以实现二进制搜索等技术,并且它们快速且无重复。
这是java Sets的结构。
它也不会允许重复,因此减少冗余并节省你的记忆。
如果您想了解各种搜索算法的复杂性,请参阅此链接。这是
答案 1 :(得分:3)
使用Trie或Patricia tree,具体取决于单词的分布。我个人会选择Patricia树,因为它更适合内存使用(虽然它更难实现)。
答案 2 :(得分:0)
也许您想测试我的TrieMap
或TrieSet
实施(found here)?我已经专门针对像这样的案例写了它们。到目前为止,我已经为String
和byte[]
密钥实现了Tries。
TrieSet<String> t = Tries.newStringTrieSet();
t.add("hello");
t.add("help");
t.add("hell");
t.add("helmet");
t.add("hemp");
List<String> resultsA = new ArrayList<>();
t.findElements("hel", true, resultsA); // search for prefix
List<String> resultsB = new ArrayList<>();
t.findElements("ell", false, resultsB); // search for substring
System.out.println("A: " + resultsA);
System.out.println("B: " + resultsB);
这将打印:
A: [hell, hello, helmet, help]
B: [hell, hello]
答案 3 :(得分:0)
这看起来对我很好,我不知道我出于某种原因是错的:
//put all your words to an ArrayList and sort the list.
List <String> arr = new Arraylist<>();
while(there is next)
arr.add(theWord)
Collections.sort(arr);
//this is your search method
boolean mysearch(keyword){
return Collections.binarySearch(arr, keyword)
}
性能为:O(n*log_n)
用于插入数据,搜索为O(log_n)
假设平均每个字符串为20B。 20B *200000 = 4MB
空间。