【问题标题】:Java: Best way to find word in alphabetic sorted text fileJava:在按字母排序的文本文件中查找单词的最佳方法
【发布时间】:2012-03-05 01:25:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 请注意,LineNumberReader 并没有声称可以有效地索引文件或获取行数。它仅在线性读取文件时报告当前行号。
  • 好的,谢谢你告诉我。

标签: java text-files binary-search alphabetical


【解决方案1】:

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

如果您真的想自己执行此操作,则需要创建两个单独的索引:

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

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

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

【讨论】:

  • 感谢反馈,一定会考虑!
【解决方案2】:

逐行读取文件效率很低,是的,尤其是在您使用的语料库大小的情况下。您是否考虑过在非平面文件中索引数据?像一个可以查询的数据库?还是使用 Lucene 之类的工具来索引和搜索数据?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-11-17
    相关资源
    最近更新 更多