超大文件中查找关键字

一个有10亿条记录的文本文件,已按照关键字排好序存储。请设计算法,可以快速的从文件中查找指字关键字的记录。
因为已经排好序了,可以使用 二分查找方法检索。
又因为文件过于庞大,可以将文件File分成1000份子记录集即读入10000次,每次读入10亿/10000条记录;
每次 读入一次 10亿/10000 条记录时,记作,将其关键字保存于Records数组中 ,
 当读入一个子记录集时,说明关键字key>=Records[0],故只需将关键字key与Records[i]最后一条记录关键字key‘比较,

若key<=key‘,则key在这个records数组中,使用二分查找法检索,若检索不到,则查找失败,返回false结束循环,检索到了,输出true结束循环。

若key>key‘,说明不在该子记录集,则读入下一个子记录集, 循环上述步骤。
若全部读到文件尾,还未查找到,则输出false;

本题以6千左右记录,每次读入1千,模拟上题;

/*在文件中查找关键字:
* 文件中大概有 6千到七千条记录
* 每次读入1千条记录,将其关键字,存于数组,在其中查找
j为本次读入的记录数; 最后一条记录的数组下标为j-1
* 因为文件中记录是有序的,故,当读一个记录集时, 必然会有 key>=recored[0];
* 只需要判断 key 与recored[j-1]的大小,
* 若key>record[j-1] 说明关键字不在此记录集,进入下一次循环。
* 若key<=record[j-1] 则到此记录集中查找:
* 若查找到,则返回true结束循环,
* 若查找不到,说明 整个文件中均不存在此关键字,返回false结束循环
当读完整个文件时,还未查找到,返回false;

public static int recordNumber=6292;
public static File file=new File("E:"+File.separator+"program"+File.separator+"FilesIO"+File.separator+"Text.txt");

*/

public static boolean findKey(int key)throws IOException{
  BufferedReader reader=new BufferedReader(new FileReader(file));
  for(int i=0;i<7;i++){
    Integer[] record=new Integer[1000];
    int j;
    String s;
    for(j=0;j<1000;j++){
      if((s=reader.readLine())!=null){
        String[] strarray=s.split(" ");
        record[j]=Integer.parseInt(strarray[0]);
      }else{
        break;
      }
    }
    if(key<=record[j-1]){
      return twoDevideFindKey(record,0,j-1,key);
    }

  }

  return false;
}
//二份查找法
public static boolean twoDevideFindKey(Integer[] array,int low,int high,int key){
  if(low<=high){
    int mid=low+(high-low)/2;
    if(array[mid]==key) return true;
      if(array[mid]>key){
        return twoDevideFindKey(array,low,mid-1,key);
      }else{
        return twoDevideFindKey(array,mid+1,high,key);
    }
  }else
    return false;
}

-------------------------------------------文件创建,写入

/*
* 创建文件,写入6千左右条记录:
* 每条记录一行,第一个字符为关键字,后面为内容。
* 没有关键字相同的记录;
* 记录按关键字排序
*/
public static void createRecordFile() throws IOException{
  if(!file.exists()){
    System.out.println("文件不存在,将创建文件");
  if(!file.createNewFile()){
    System.out.println("文件已存在");
  }else{
      System.out.println("已创建文件");
    }
  }
  PrintWriter out=new PrintWriter(new FileWriter(file));
  SortedSet<Integer> keySet=new TreeSet<Integer>();
  for(int i=0;i<10000;i++){
    int key=(int) (Math.random()*10000);
    if(!keySet.contains(key))
        keySet.add(key);
  }
  recordNumber=keySet.size();
  Iterator<Integer> iter=keySet.iterator();
  int counter=0;
  while(iter.hasNext()){
    int key=iter.next();
    out.println(key+" "+"example"+counter++);
  }
  if(out!=null) out.close();
  System.out.println("记录数为:"+recordNumber);
}

时间: 2024-10-20 09:30:53

超大文件中查找关键字的相关文章

Visual Studio 2013 无法使用:在文件中查找(Ctrl+Shift+F)

最近遇到一个问题就是在win7(32位.64位都试过)上安装Visual Studio 2013(专业版.旗舰版都试过)之后,打开项目,使用:在文件中查找(Ctrl+Shift+F)功能时,会突然奔溃. 后来,突然想到在安装的时候,右键,以管理员身份安装. 于是,尝试了一下,搞定!

从OTF字体文件中查找字体名称

for in ? 使用神器vim就好了... vim ./AKZIDENZGROTESK-COND.OTF 从OTF字体文件中查找字体名称,布布扣,bubuko.com

Rhel7 grep在文件中查找指定的字符串,将其输出到指定文件

Rhel7 grep在文件中查找指定的字符串,将其输出到指定文件 [[email protected] findfiles]# cat /usr/share/dict/words |grep seismic anaseismic antiseismic aseismic -- [[email protected] findfiles]# cat /usr/share/dict/words |grep seismic >>/root/wordlist [[email protected] fin

grep在指定类型的文件中查找字符 (转载)

转自:http://blog.csdn.net/qvbfndcwy/article/details/8127329 find -name '*.php'|xargs grep 'include'//在当前目录及其子目录的php文件中查找include字符串 find . -name '*.php' -exec grep -i -nH "include" {} \;//同上

Linux在所有文件中查找和替换

经常会碰到这样的情况:查找某个目录下所有包含某个字符串的所有文件,并将这些文件中的这个字符串用另外的字符串替换进行替换.这种情况下,网网要检查的文件比较多,逐一进行检查替换太麻烦,这个时候,我们就应该找一个能够一条命令解决问题的方法. 1.grep命令 grep pattern file.txt命令默认的行为是将file.txt文件中,匹配pattern的行输出到标准输出.这个功能能帮助我们在文件中查找一个字符串出现的上下文,但是并不能够帮助我们实现下一步复杂的操作,所以有必要稍微了解下grep

在某个目录下的所有文件中查找包含某个字符串的Windows命令

findstr可以完成这个工作. findstr /s /i "string" *.*   上面的命令表示,当前目录以及当前目录的所有子目录下的所有文件中查找"string"这个字符串. *.*表示所有类型的文件. /s 表示当前目录以及所有子目录 /i 表示不区分大小写 可以参考help findstr的输出解释来使用此命令. 注意: findstr.exe一般在C:\Windows\System32目录下,要从任意路径调用该命令,需要将C:\Windows\Sy

Microsoft Visual Studio 2008 在文件中查找 失效的解决方法

1: 暂时的解决办法是,在'在文件中查找'按钮边上的下拉框中输入要查询的东西,然后回车 2: 选择窗口的重置窗口布局.(该方法解决了我的问题,原因分析大概是 弹出的窗口被别的挡住了) 3: 修复Microsoft Visual Studio 2008

在所有存储过程中查找关键字,关键字不区分大小写

CREATE PROCEDURE [dbo].[sp_findproc] (@akey varchar(255)) AS -- 在所有存储过程中查找关键字,关键字不区分大小写 declare @aname as varchar(700) declare @atext as varchar(8000) declare @acolid as int declare @pos as int declare @start as int declare @end as int declare @short

【SQL语句】 - 在所有存储过程中查找关键字,关键字不区分大小写 [sp_findproc]

USE [EShop]GO/****** Object: StoredProcedure [dbo].[sp_findproc] Script Date: 2015/8/19 11:05:24 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[sp_findproc] (@akey varchar(255)) AS -- 在所有存储过程中查找关键字,关键字不区分大小写declare @aname