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

时间:2013-04-18 10:15:47

标签: java data-structures

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

PS:也许使用数据结构不是更好的方法吗?每次包含单词的文件读取效率会更高吗?

编辑:这是一个小项目。我必须处理有效性和记忆

最后编辑:我最终选择了HashSet。

4 个答案:

答案 0 :(得分:5)

使用java集因为集合是像TreeSet这样的线性排序数据结构。因此,对于搜索,可以实现二进制搜索等技术,并且它们快速且无重复。

这是java Sets的结构。

enter image description here

它也不会允许重复,因此减少冗余并节省你的记忆。

如果您想了解各种搜索算法的复杂性,请参阅此链接。这是

http://bigocheatsheet.com/

答案 1 :(得分:3)

使用TriePatricia tree,具体取决于单词的分布。我个人会选择Patricia树,因为它更适合内存使用(虽然它更难实现)。

答案 2 :(得分:0)

也许您想测试我的TrieMapTrieSet实施(found here)?我已经专门针对像这样的案例写了它们。到目前为止,我已经为Stringbyte[]密钥实现了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空间。