Binay搜索bitonic序列中的最大元素

时间:2016-08-27 19:56:39

标签: algorithm binary-search

首先,将该问题的比特数组定义为对于长度为N的数组中的某些索引K,其中0 <0。 K&lt; N - 1和0到K是单调递增的整数序列,K到N - 1是单调递减的整数序列。

示例:[1,3,4,6,9,14,11,7,2,-4,-9]。它从1到14单调增加,然后从14减少到-9。

我担心的是我无法理解二元搜索在寻找比特序列中最大的元素。

2 个答案:

答案 0 :(得分:2)

您基本上是在搜索位置 m ,以便项目增加到 m ,并从中开始减少。

regular binary search的修改可以解决这个问题。

您的搜索在 l r 之间的每次迭代中进行,分别初始化为0和 n - 1

在每次迭代中,选择 m =⌊(l + r)/2⌋。检查 m 的左右邻居(除非 m = 0 m = n - 1 ,只检查一个邻居),并比较这三个要素。有三种情况:

  1. 左邻居较小而右邻居较小 - m 的元素是你想要的。

  2. 左邻居较小而右邻居较大 - 您需要向右搜索。

  3. 左邻居较大而右邻居较小 - 您需要向左搜索。

  4. 当您向左或向右移动时,您可以像通常的二分查找一样调整 l r

    终止与常规二进制搜索一样,但以下情况除外。请注意,如果它在您未找到右下邻居的位置终止,则答案位于 n - 1 ;如果它以找到左下邻居终止,则答案为0。

答案 1 :(得分:0)

返回给定的bitonic数组中最大元素的索引(首先是升序,然后是降序,没有重复):

private int findMax(int[] array, int low, int high) {
    int mid = low + (high-low)/2;

    if (high == low) return high;   // max has be found

    else if (array[mid] < array[mid+1]) {
        return findMax(array, ++mid, high); // search in the right subarray
    } else {
        return findMax(array, low, mid);    // search in the left subarray
    }
}