Java:在按字母顺序排序的文本文件中查找单词的最佳方法

标签 java text-files binary-search alphabetical

我有这个按字母顺序排序的巨大索引,我需要获取特定术语的行。逐行阅读文件并检查我是否得到了正确的术语对我来说似乎效率不高,因此索引的大小(我们索引了英语维基百科语料库)。

因此,我正在寻找一种对行进行二进制搜索的方法。我使用 LineNumberReader 来有效地获取行数,但似乎没有有效的解决方案来从文件中获取第 n 行。

我想知道是否阅读行直到我到达第 n 行,检查它是否是正确的术语并根据二进制搜索算法采取行动(可能再次阅读这些行,因为我需要我已经跳过的行)比逐行检查条款更有效吗?

也非常欢迎任何其他建议!

请注意,我需要获取一组行,具体取决于要搜索的术语集。

最佳答案

听起来您应该使用数据库 - 它们受益于多年与大型数据集的索引查询相关的精心设计,如果您自己动手,您不太可能接近它。

如果你真的想自己做,你需要创建两个单独的索引:

  • 单词索引 -> 包含该术语的行号,以便您可以快速计算包含给定搜索词的行号集
  • 行号索引 -> 在文件中的位置,以便您可以通过随机访问快速检索正确的行

此外,如果您的数据集非常大,那么这两个索引本身都可能比内存大。所以你必须实现一个基于磁盘的索引——类似于 B-Tree .到那时,您将重新发明大部分 RDBMS 轮子,并且可能会因为一开始就没有使用合适的数据库而自责。

考虑尝试 PostgreSQL - 它是开源的,非常成熟且维护良好,并且具有相当不错的文本搜索功能。

关于Java:在按字母顺序排序的文本文件中查找单词的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9560578/

相关文章:

java - Swing 控件不可见

java - 为什么在将 CGLIB 原型(prototype)注入(inject) Singleton 的情况下,每次对原型(prototype)的访问都会创建一个新对象?

excel - 解决 Excel VBA 文本文件导出中的运行时 91 错误

python - 我想要一些建议,为什么这不会将数据插入我的 SQL 表

javascript - 执行二进制搜索时如何正确显示数组中不存在值

arrays - 如果当前索引的值小于我们要查找的值,为什么我们在斐波那契搜索中丢弃 2 个斐波那契数?

java - 无法访问 0 以外的索引

java - Struts 2 文本字段即使没有 value 属性也会显示值

C# 文本文件搜索特定单词并删除包含该单词的整行文本

相当于 C++ equal_range(或 lower_bound 和 upper_bound)的 Java