【问题标题】:Binary search inside a buffer缓冲区内的二进制搜索
【发布时间】:2013-03-05 05:28:30
【问题描述】:

所以我实现了一个使用二进制搜索方法搜索文件的工作程序:

public int BSearch(int x1, int x2) throws IOException {
    int current_key;

    middle=(x1+x2)/2;
    if(x1>x2) {
        middle=-1;  //middle==-1 is condition of 'key not found'
        return middle;
    }
    MyFile.seek(middle*4);
    current_key=MyFile.readInt();
    da++;
    if(current_key==key) {
        return middle;
    }
    else if(key<current_key) {
        x2=middle-1;
        return BSearch(x1,x2);
    }
    else {
        x1=middle+1;
        return BSearch(x1,x2);
    }
}

现在我想对其进行转换,以便将文件逐个(例如每次 1KB)读取到缓冲区中,然后对该缓冲区进行二进制搜索。如果在该缓冲区中找不到密钥,我会进一步读取文件,依此类推。我想澄清一下,缓冲区是这样的手工缓冲区(纠正我):

 byte[] buf = new byte[1024];
 MyFile.read(buf);
 ByteArrayInputStream bis= new ByteArrayInputStream(buf1);
 DataInputStream ois= new DataInputStream(bis);
 current_key=ois.readInt();

一个大问题(除其他外)是我不知道如何从缓冲区的某个位置读取数据

【问题讨论】:

  • 为什么不能直接使用整个文件?
  • 这个想法是我想使用小缓冲区,这样我就可以以同样的方式处理大文件(如 5 GB)。当然,我无法将 5GB 读入主内存。
  • 我认为不需要将整个文件加载到 RAM 中。您可以简单地使用seek 并读取相关字节。 seek 函数接受 long,它最多可以寻址 8 艾字节,这应该足够了。
  • 我想你说的和我现在所做的一样,或者我无法理解你:P。我想这样做的原因是跳过访问磁盘并更多地使用内存,这样更快。我只是不知道如何搜索缓冲区。
  • Arrays.binarySearch(...) 怎么样? docs.oracle.com/javase/6/docs/api/java/util/Arrays.html 此外,从算法上讲,一次搜索整个文件会更快,因为当你的块很小时,你的 O(log n) 变成 O(n)。

标签: java file search binary buffer


【解决方案1】:

好的,我想我设法通过将缓冲区逐个元素复制到一个新的 int[] 数组来做到这一点。我想相信它仍然比每次我想加载缓冲区时访问磁盘要快。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 2013-05-20
    • 2010-12-05
    • 2014-09-01
    • 1970-01-01
    • 2021-07-24
    • 2019-06-04
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多