【发布时间】:2010-07-27 11:35:00
【问题描述】:
将包含 100.000 个单词的字典中的单词存储在字符串的静态数组中是否是个好主意。我正在研究拼写检查器,我认为这样会更快。
【问题讨论】:
将包含 100.000 个单词的字典中的单词存储在字符串的静态数组中是否是个好主意。我正在研究拼写检查器,我认为这样会更快。
【问题讨论】:
对于任何重要的事情,您通常应该更喜欢 Java Collections Framework 类而不是原生 Java 数组。在这种特殊情况下,您所拥有的是 Set<String>(因为字典中的单词不应出现多次)。
HashSet<String> 为基本操作 add、remove 和 contains 提供恒定的时间性能,并且应该与 String 哈希码公式很好地配合使用。
对于较大的字典,您可能希望使用专门用于存储一组字符串的更复杂的数据结构(例如 trie),但对于 100K 字,HashSet 就足够了。
【讨论】:
将这么多字符串存储为一个数组绝对不是一个好主意,尤其是当您使用它进行拼写检查时,这意味着您必须搜索和比较字符串。它会降低通过数组搜索或比较字符串的效率,因为它始终是线性搜索
【讨论】:
使用内存数据库技术的方法怎么样,例如sqlite inmemory 这使您可以使用高效的查询而无需磁盘开销
【讨论】:
我认为 100 000 并没有那么大,以至于搜索效率低下。当然这取决于...如果您正在检查数组中是否存在单词,它会很好用 - 这是一种线性复杂度算法。您可以保持表格有序,这样您就可以使用快速排序搜索算法并提高效率。
另一方面,如果您想找到 5 个最有可能的词(使用 N-gram 方法或其他方法),您应该考虑使用 Lucene 或其他文本数据库。
【讨论】:
也许使用 SQLite 数据库会更有效?我认为这就是 firefox/thunderbird 所做的拼写检查,但我不完全确定。
【讨论】:
您将无法在静态变量中存储这么多字符串。 Java 对静态代码甚至方法体都有大小限制。只需使用平面文件并在类实例化时读取它 - Java 比大多数人想象的要快。
见Enum exeeding the 65535 bytes limit of static initializer... what's best to do?。
【讨论】: