更有效地读取按字母顺序排序的文本文件

时间:2014-09-07 07:09:02

标签: java android sorting record

我有一个包含74027条记录(只有一列)的大型文本文件(。txt),按字母顺序排列 。在那些记录中,我需要找到一条记录。

我有这段代码 -

BufferedReader reader = new BufferedReader(new FileReader("/###/myfile.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
    Pattern.compile(Pattern.quote(s2), Pattern.CASE_INSENSITIVE).matcher(s1).find();
    //...
}

但是这段代码需要很长时间才能找到记录,因为它逐行读取文件。但由于我按字母顺序排列记录,有没有办法更有效地找到记录?

3 个答案:

答案 0 :(得分:2)

在while循环外编译模式:

Pattern pattern =  Pattern.compile(Pattern.quote(s2), Pattern.CASE_INSENSITIVE);
while ((line = reader.readLine()) != null) {
    pattern.matcher(s1).find();
    //...
}

答案 1 :(得分:1)

文件是一种顺序数据结构,只允许线性搜索,这当然是线性时间。为了最大限度地提高这一点,您需要更改数据结构,以便允许随机访问二进制搜索。我可以想到几种方法:

  1. 重新格式化您的文件格式,以便您可以随机访问它。这意味着您需要使每个记录的大小相同。

  2. 将整个文件读入适当的内存数据结构,可能只是一个ArrayList。

  3. 编写您自己的数据结构,为您当前的文件格式提供随机访问接口。

  4. 如果这些都不可行,那么您将不得不接受对当前线性搜索的微小优化。这些优化只会影响常数因素而不会改变运行时复杂性,因此其优势比以前的建议更有限。

答案 2 :(得分:1)

以大块的形式读取文本,一次说500行(100个字符/行,大约50K)

读入前两个完整的块。找到第二个块中的第一个完整行(找到第一个换行符,然后到达下一个换行符。)

如果第一个完整行按字母顺序小于您要搜索的模式,则可以丢弃整个上一个块而不对其进行任何模式搜索。

对每个块重复(检查第一个完整行并丢弃前一个块,如果它小于目标模式)

当您找到第一个完整行大于您的模式的块时,然后将该块开头的部分行(第一个完整行之前的文本)附加到上一个块的末尾,然后搜索感兴趣的模式的前一个块。

如果到达最后一个区块且第一个完整线条小于模式,则在最后一个区块中搜索您感兴趣的模式。