【问题标题】:What data structure I should use for my dictionary? [closed]我的字典应该使用什么数据结构? [关闭]
【发布时间】:2016-03-06 14:12:54
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以在Map 中为每个键存储一个值,但没有什么能阻止您将该值作为SetList,甚至另一个Map...跨度>
  • 为什么不用sql数据库?然后你可以使用LIKE 操作符。

标签: java dictionary arraylist data-structures


【解决方案1】:

您要搜索的是trie

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

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

    • 您能否将链接的摘要添加到答案中?链接有一段时间后消失的趋势。
    • 只存储单词就好了。但是如果我存储例如“结束”,如果我输入“t”、“th”或“the”,trie 只会列出“结束”(以及它的含义)。但如果我输入“e”、“en”或“end”,我想列出它。因此,如果其中任何单词以我在搜索区域输入的字母开头,我想列出短语。
    • @racz16 我认为没有优化String#contains 检查的结构,但根据短语长度,您可以检查其子字符串,例如“结束”、“他结束”、“e 结束”、“结束”、“结束”、“nd”、“d”、“”。
    • 最后,我实现了一个trie,它运行良好,速度相当快。
    【解决方案2】:
    1. 使用简单数组
    2. 对数组进行排序
    3. 用二分法搜索

    如果您填写一次字典然后只进行搜索,这是最快的解决方案。

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

    仅当数据足够大时,额外的树索引才有用。

    【讨论】:

      【解决方案3】:

      您可以使用 NavigableSet 进行部分查找。

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

      打印出来的

      th ... the
      th ... their
      th ... there
      

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

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

      【讨论】:

      • 我没完全理解你说的,你能解释的更详细一点吗?它只存储一个单词,而不是一个具有其含义的单词,如果我输入“th”,我想列出所有以“th”开头的单词,所以不仅要列出“the”,还要列出“there”。跨度>
      • @racz16 我已更新我的答案以包含多个结果。
      猜你喜欢
      • 2012-07-29
      • 2011-12-12
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      相关资源
      最近更新 更多