二进制搜索具有不同字长的文件

时间:2018-09-27 20:10:23

标签: java

我正在制作一个粗糙的Java拼写检查器,该检查器包含一篇文章和一个预先排序的字典文件。文章的字词长度各不相同,因此,我尝试制作一个使用文件给出的字词的堆栈。

不幸的是,由于堆栈空间不足(即使使用缩短的字典文件),并且由于性能方面的考虑,我决定直接从文本文件中读取内容。

问题在于文件中没有相同长度的单词。由于单词的长度各不相同,因此我不能也不应期望单个单词的长度对确定字典文件中的单词数(从文件的大小)很有用。

因此,我被困住了。我需要对该文件执行二进制搜索,以使拼写检查程序正常工作。但是,如果没有明确的方法将文件视为数组,则无法执行二进制搜索,尤其是当数组太大而无法放入程序的内存中时。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

牛津英语词典建议您为词典考虑大约~250,000 words(不考虑仅用于特定领域的单词)。这对您来说是重要的设计信息。

我看到了一些解决方案:

1)只需使用HashSet<>

理论上,您可以将HashSet<>用于此数量的元素(此SO post讨论了HashSet s的理论极限以及其他详细信息)。

但是,这带来了(如您所观察到的)一些问题:

  • (在每次启动应用程序时)需要一些时间才能将其读入RAM

  • 它吃光了RAM

当然,您可以增加JRE的堆大小,但是对此有一个自然的限制(@StvnBrkddll链接了一个SO post,在注释中对此进行了完美描述)

2)使用数据库

我会考虑将有效词存储在(关系)数据库中:

  • 您无需在应用程序启动时加载所有内容

  • 它在RAM上的重量不如选项(1)

  • 它给您更多选择,如果您想更改应用程序以向用户建议类似的单词而没有错别字(例如,如果您使用PostgreSQL,则可以实现pg_trgm

但是它有一些缺点:

  • 您提到您的应用程序很简单:拥有数据库系统会增加复杂性