Java:存储大量单词的数据结构
我必须在Java程序中储存大量word(+200k),并且我想快速访问它们。 我只想知道一个给定的单词是否属于我的“字典”。我不需要像Java:存储大量单词的数据结构,java,data-structures,Java,Data Structures,我必须在Java程序中储存大量word(+200k),并且我想快速访问它们。 我只想知道一个给定的单词是否属于我的“字典”。我不需要像这样的一双鞋。 如果可能,我正在标准库中搜索解决方案 PS:也许使用数据结构不是更好的方法?每次读取包含单词的文件会更有效率吗 编辑:这是一个小项目。我必须处理有效性和记忆力 最后一次编辑:我最终选择HashSet。根据单词的分布使用或。我个人会选择Patricia tree,因为它在内存使用方面更优化(尽管它更难实现)。使用java集合,因为集合是像TreeSe
这样的一双鞋。
如果可能,我正在标准库中搜索解决方案
PS:也许使用数据结构不是更好的方法?每次读取包含单词的文件会更有效率吗
编辑:这是一个小项目。我必须处理有效性和记忆力
最后一次编辑:我最终选择HashSet。根据单词的分布使用或。我个人会选择Patricia tree,因为它在内存使用方面更优化(尽管它更难实现)。使用java集合,因为集合是像TreeSet一样的线性排序数据结构。因此,对于搜索,可以实现像二进制搜索这样的技术,而且它们速度快,没有重复 这是一个java集合的结构 此外,它将不允许复制,从而减少冗余,并将节省您的内存 如果您想了解各种搜索算法的复杂性,请参阅此链接。这是
也许您想测试我的
TrieMap
或TrieSet
实现()?我专门为这种情况写的。到目前为止,我已经实现了对String
和byte[]
键的尝试
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);
这对我来说很好,我不知道我是否因为某种原因错了:
//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)
}
//将所有单词放入ArrayList并对列表进行排序。
List arr=new Arraylist();
而(还有下一个)
添加(单词)
集合。排序(arr);
//这是您的搜索方法
布尔mysearch(关键字){
返回集合。二进制搜索(arr,关键字)
}
性能是:O(n*log\n)
用于插入数据和搜索是O(log\n)
比如说,每个字符串平均为20B
20B*200000=4MB
空间。听起来a可能很合适。你知道使用@Keppil吗?HashSet中的问题是它没有排序。所以搜索会比较慢。@Nikhil:在HashSet
中查找单词是O(1)
,而在TreeSet
中查找单词是O(logn)
HashSet,它的速度要快得多。感谢会浪费很多记忆。这类任务有专门的数据结构。@IvayloStrandjev存储在哈希集中的平均10个字符的200k个单词可能需要5到10MB的内存。这不是很多…@assylias Ya这就是搜索的速度,因为集合是经过排序的,你可以对它们应用许多技术。至于性能,在我的台式电脑上,用20万个单词填充一个哈希集并运行100万个单词的查找总共需要大约150毫秒。每个人在Particia或Trie中搜索至少也同样有效。有专门的数据结构用于处理字符串。对于OP用例中相当少量的对象,哈希集就可以了。还值得注意的是,标准JDK中没有Trie/Patricia树实现。>1.5 KLOC,没有一个测试?
//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)
}