如何在不使用java中的数组的情况下进行二进制搜索

时间:2013-04-18 18:26:50

标签: java

我正在尝试创建一个不使用数组的二进制搜索。它还需要计算它执行的搜索次数,直到找到该数字。我还必须使用randomaccessfile。

RandomAccessFile raf=new RandomAccessFile(new File("Project 10"),"rw");

//writing in random numbers. Different numbers will be used when it is being tested

raf.writeInt(-5);
raf.writeInt(-1);
raf.writeInt(122);
raf.writeInt(124);
raf.writeInt(125);
raf.writeInt(256);

用户输入您要搜索的号码。我需要在不使用扫描仪类的情况下执行此操作。这样做的方法非常有用

我知道这是你用数组进行二进制搜索的方法。我需要帮助搞清楚如何在没有数组的情况下做到这一点

public static int binarySearch(int[] list, int key) {
    int low = 0;
    int high = list.length - 1;

    while (high >= low) {
        int mid = (low + high) / 2;
        if (key < list[mid])
            high = mid - 1;
        else if (key == list[mid])
            return mid;
        else
            low = mid + 1;
    }
    return -low - 1; // Now high<low, key not found
}

3 个答案:

答案 0 :(得分:1)

这不是一个特定于java的问题,而是一个算法问题。 虽然没有说明,但你的二进制搜索显然是基于文件以某种方式神奇地进行排序。

那就是说,你知道raf.writeInt(xxx)将把一个标准化的字节长度值写入文件。将文件本身视为每个索引位置所在的数组 a [i * 4] ==所以,创建一些函数来计算'mid''low'和'high'作为所需索引的倍数。

Google进行“外部排序”

答案 1 :(得分:1)

如果将文件视为数组,则不需要数组或列表。假设文件已排序,伪代码将类似于

  1. 获取文件中的行数(可能需要猜测......不确定如何计算新行)
  2. 读取总行数1/2的值
  3. 如果值相同,则完成。如果较小,请使用文件的前半部分重复。如果更大,请使用文件的后半部分重复。

答案 2 :(得分:0)

Would something like this work?

public static int binarySearch(int raf//for the file?, int key//for input?){
int low=0;
int high=raf.length()-1
while (high>=low){
int mid=(low+high)/2;
if (key<raf.[mid])// Does the [] automatically make it an array
high=mid-1;
else if (key==raf.[mid])
return mid;
else
low=mid+1;
}
return-low-1//now high < low, key not found
}
}