Java 缓冲区内的二进制搜索
因此,我实施了一个工作程序,使用二进制搜索方法搜索文件:Java 缓冲区内的二进制搜索,java,file,search,binary,buffer,Java,File,Search,Binary,Buffer,因此,我实施了一个工作程序,使用二进制搜索方法搜索文件: 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; } MyFi
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);
}
}
一个大问题(除其他外)是我不知道如何从缓冲区的某个位置读取数据。好的,我想我是通过将缓冲区逐元素复制到一个新的int[]数组元素来实现的。我想相信每次加载缓冲区时,它仍然比访问光盘快。为什么不能使用整个文件呢?我的想法是使用小缓冲区,这样我就可以以同样的方式处理大文件(如5 GB)。当然,我无法将5GB的数据读入主内存。我认为不需要将整个文件加载到RAM中。您只需使用
seek
并读取相关字节即可。seek
函数接受一个long
,它最多可以寻址8个EB,这就足够了。我想你说的和我到目前为止所做的是一样的,或者我就是不能理解你:P。我想这样做的原因是跳过访问光盘,更多地使用更快的内存。我只是不知道如何搜索缓冲区。Arrays.binarySearch(…)
?此外,从算法上讲,一次搜索整个文件的速度更快,因为当块很小时,O(logn)变成O(n)。
byte[] buf = new byte[1024];
MyFile.read(buf);
ByteArrayInputStream bis= new ByteArrayInputStream(buf1);
DataInputStream ois= new DataInputStream(bis);
current_key=ois.readInt();