循环/搜索数组直到特定索引

时间:2013-11-21 01:32:17

标签: java arrays binary-search fibonacci

如何遍历数组直到你到达数组的最后50个元素。我想搜索给定的数组,直到我到达这个数组的最后50个元素,然后搜索以顺序查看结束50个元素。我的问题是如何构建这样的循环以及如何跳转到执行线性搜索的方法。

说我有以下斐波那契搜索代码。它类似于二进制搜索,除了它使用下一个Fibonacci数字将列表分成两个分区。

Fibonacci搜索代码:

public class Practice
{
static int Fib[] =
    {
        0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765,
        10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578,
        5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296,
    433494437, 701408733, 1134903170, 1836311903
    };

static int binsrch_geq(int n, int val)
{
    int low, high, mid;
    int geq;
    low = 0;
    high = n - 1;
    geq = -1;
    while (low <= high)
    {
        mid = (low + high) >> 1;
        if (val < Fib[mid])
        {
            high = mid - 1;
            geq = mid;
        }
        else if (val > Fib[mid])
        {
            low = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return geq;
}

static int fibsrch(int arr[], int n, int val)
{
    int k, idx, offs;
    int prevn = -1, prevk = -1;
    if (n != prevn)
    {
        k = (n > 1) ? binsrch_geq(Fib.length, n) : 1;
        prevk = k;
        prevn = n;
    }
    else
    {
        k = prevk;
    }
    for (offs = 0; k > 0;)
    {
        idx = offs + Fib[--k];
        if (idx >= n || val < arr[idx])
        {
            continue;
        }
        else if (val > arr[idx])
        {
            offs = idx;
            --k;
        }
        else
        {
            return idx;
        }
    }
    return -1;
}

public static void main(String[] args)
{
    int data[] =
    {
        1, 4, 5, 7, 9, 11, 13, 16, 18, 20, 25, 27, 30, 32, 33, 36, 39, 41, 44, 47, 51, 53, 55, 60,61,64,66,69,71,72,
        74,75,79,80,81,83,87,88,90,92,94,95,96,97,98,99,100,101,105,106,109,111,112,119,120,122,124,126,129,130,134,
        135,138,139,143,144,145,146,149,150,153,159,160,164,166,167
    };
    int i, x, n;

    ///////////////////////////////////////
    ///////////////////////////////////////
    x = 164;
    //////////////////////////////////////
    //////////////////////////////////////
    n = data.length;
    i = fibsrch(data, n, x);
    if (i >= 0)
    {
        System.out.println(x + " found at index " + (i+1));
    }
    else
    {
        System.out.println(x + " was not found");
    }
}

}

1 个答案:

答案 0 :(得分:2)

如果你知道数组至少有50个元素可以写:

//PRE: arr.length >= 50
public int searchInTop50(int[] arr, int val){
    for(int i = arr.length - 50; i < arr.length; i++){
        if(a[i] == val)
            return i;
    }
    return -1;
}

如果找到则返回值的索引,否则返回-1。它可以像任何其他方法一样调用。如果我正确理解了您的问题,您可以对第一个 n - 50个元素进行二进制搜索,然后如果找不到该值,则执行searchInTop50方法。要停止在某个索引处搜索,可以将其传递给二进制搜索方法的参数。 start和stop索引通常传递给二进制搜索的递归实现。你可能想看一下。