我应该在字典中使用哪种数据结构?

时间:2015-12-02 10:57:51

标签: java dictionary arraylist data-structures

我想在Java中创建一个包含大约10 000个单词对的字典,但我不知道应该使用哪种数据结构。如果我在字典中有一个单词,例如because,我希望程序找到它,如果我只搜索bec。如果我有the end这样的词组,我希望在搜索then时找到它。

我尝试ArrayList,但搜索速度很慢。我不想使用实现Map接口的类,因为它们只能为一个键存储一个值,因此我无法按上述方式进行搜索。

这个答案列出了字典的一些数据结构,但我认为它们对我来说是最好的:Best data structure for implementing a dictionary?

3 个答案:

答案 0 :(得分:1)

您要搜索的内容为trie

由于java框架似乎没有一个实现,请查看this thread以获取可能的库和解决方案:

  • Robert Sedgewick's book "Algorithms"中的解释和基本java实现
  • Patel's blog上的解释和基本的Java实现
  • an oracle thread上的解释和基本的Java实现
  • GitHub上的java库"Concurrent Radix and Suffix Trees for Java"
  • GitHub上的java库"Practical Algorithm to Retrieve Information Coded in Alphanumeric (PATRICIA)"
  • a java library by brianfromoregon on GitHub

  • 答案 1 :(得分:0)

    您可以使用NavigableSet,它允许您进行部分查找。

    int bitsSoFar = 0;
    int retval = 0;
    while(mask) { // Until we've looked up all bits.
       int mask4 = mask & 0xF;
       int input4 = input & 0xF;
       retval |= LUT[mask4][input4] << bitsSoFar;
       bitsSoFar += bitsIn[mask4];
       mask >>= 4;
       input >>= 4;
    }
    

    打印

    NavigableSet<String> words = new TreeSet<>();
    words.add("tee");
    words.add("the");
    words.add("there");
    words.add("tidy");
    
    String th = words.higher("th");
    System.out.println("th ... "+th);
    

    如果你想要多个单词,你可以做到

    th ... the
    

    打印

    NavigableSet<String> words = new TreeSet<>();
    words.add("tee");
    words.add("the");
    words.add("their");
    words.add("there");
    words.add("tidy");
    
    String start = "th";
    for (String w : subSet(start, start + '\uffff')) {
        System.out.println(start + " ... " + w);
    }
    

    您可以使用单独的地图逐字查找短语。

    注意:这比使用SQL数据库快1000到10000倍。

    答案 2 :(得分:0)

    1. 使用简单数组
    2. 对数组进行排序
    3. 使用二进制搜索搜索
    4. 如果您填写一次字典然后只进行搜索,这是最快的解决方案。

      以相同字母开头的单词将彼此相邻堆叠。

      其他树索引仅在数据足够大时才有用。