【问题标题】:Huge Static Array of String巨大的静态字符串数组
【发布时间】:2010-07-27 11:35:00
【问题描述】:

将包含 100.000 个单词的字典中的单词存储在字符串的静态数组中是否是个好主意。我正在研究拼写检查器,我认为这样会更快。

【问题讨论】:

    标签: java string static


    【解决方案1】:

    对于任何重要的事情,您通常应该更喜欢 Java Collections Framework 类而不是原生 Java 数组。在这种特殊情况下,您所拥有的是 Set<String>(因为字典中的单词不应出现多次)。

    HashSet<String> 为基本操作 addremovecontains 提供恒定的时间性能,并且应该与 String 哈希码公式很好地配合使用。

    对于较大的字典,您可能希望使用专门用于存储一组字符串的更复杂的数据结构(例如 trie),但对于 100K 字,HashSet 就足够了。

    另见

    【讨论】:

    【解决方案2】:

    将这么多字符串存储为一个数组绝对不是一个好主意,尤其是当您使用它进行拼写检查时,这意味着您必须搜索和比较字符串。它会降低通过数组搜索或比较字符串的效率,因为它始终是线性搜索

    【讨论】:

    • 几乎任何人都会对数组进行字母排序和二进制搜索。
    • +1:大 O 并不总是相关的,但是当 n = 100k 时,O(n) 等于“慢得要命”。
    • 100k 并不是那么大的 N;问题不是通过 100k 条目进行线性搜索,而是每个条目都需要进行字符串比较。 +1 在这种规模下使用 HashSet。一旦开始查看比这大一到两个数量级,请考虑使用 Trie、B+Tree、ISAM-Tree 或 String-BTree。
    【解决方案3】:

    使用内存数据库技术的方法怎么样,例如sqlite inmemory 这使您可以使用高效的查询而无需磁盘开销

    【讨论】:

      【解决方案4】:

      我认为 100 000 并没有那么大,以至于搜索效率低下。当然这取决于...如果您正在检查数组中是否存在单词,它会很好用 - 这是一种线性复杂度算法。您可以保持表格有序,这样您就可以使用快速排序搜索算法并提高效率。

      另一方面,如果您想找到 5 个最有可能的词(使用 N-gram 方法或其他方法),您应该考虑使用 Lucene 或其他文本数据库。

      【讨论】:

        【解决方案5】:

        也许使用 SQLite 数据库会更有效?我认为这就是 firefox/thunderbird 所做的拼写检查,但我不完全确定。

        【讨论】:

          【解决方案6】:

          您将无法在静态变量中存储这么多字符串。 Java 对静态代码甚至方法体都有大小限制。只需使用平面文件并在类实例化时读取它 - Java 比大多数人想象的要快。

          Enum exeeding the 65535 bytes limit of static initializer... what's best to do?

          【讨论】:

          • 亲爱的downvoter:虽然我同意这不是一个非常优雅的答案,但我确实认为对严肃(非巨魔)答案的downvote值得评论。
          猜你喜欢
          • 2019-11-26
          • 1970-01-01
          • 2012-11-20
          • 2023-03-25
          • 2021-10-29
          • 2012-12-18
          • 1970-01-01
          • 2011-08-31
          • 1970-01-01
          相关资源
          最近更新 更多