Java:存储大量单词的数据结构

Java:存储大量单词的数据结构,java,data-structures,Java,Data Structures,我必须在Java程序中储存大量word(+200k),并且我想快速访问它们。 我只想知道一个给定的单词是否属于我的“字典”。我不需要像这样的一双鞋。 如果可能,我正在标准库中搜索解决方案 PS:也许使用数据结构不是更好的方法?每次读取包含单词的文件会更有效率吗 编辑:这是一个小项目。我必须处理有效性和记忆力 最后一次编辑:我最终选择HashSet。根据单词的分布使用或。我个人会选择Patricia tree,因为它在内存使用方面更优化(尽管它更难实现)。使用java集合,因为集合是像TreeSe

我必须在Java程序中储存大量word(+200k),并且我想快速访问它们。 我只想知道一个给定的单词是否属于我的“字典”。我不需要像
这样的一双鞋。 如果可能,我正在标准库中搜索解决方案

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)
}