使用二进制搜索在数组中查找数字的位置

Posted

技术标签:

【中文标题】使用二进制搜索在数组中查找数字的位置【英文标题】:Find place for number in array using binary search 【发布时间】:2012-11-07 20:02:32 【问题描述】:

我有一个数字数组,比如 nums[n] 。我必须找到位置 'i' 使得 nums[i] 在所有小于 key 的整数中最大。 nums 已排序。我知道我可以使用从 i=0 到 nums[i]>=key 位置的线性搜索来做到这一点。但我想更快地做到这一点,所以有人能告诉算法所需的二进制搜索吗?

示例:nums[]=2,4,14,25 和 key=15。因此 i 应该是 2,因为 14 是所有其他小于 15 的整数中最大的整数。

【问题讨论】:

【参考方案1】:

请记住,在正常的二分搜索代码中,使用的低和高变量表示数组的索引,因此您很容易知道位置。

首先看看a[0]>=key,因为应该至少比key少1个元素才能搜索出来。

然后进行二分查找:取出中间元素,如果这个元素是>=key,则丢弃它右边的所有元素,包括它。

但是如果 a[mid] <key ,则丢弃它左边的所有元素(包括它)并取出到目前为止找到的元素或这个元素的最大值。

代码:

    if(a[0]>=key)
    print("Some error message");
    int found=-1;
    int low=0,high=n-1;
    while(low<high)
    
    int mid=(low+high)/2;
    if(a[mid]>=key)
       high=mid-1;
    else
    
       low=mid+1;
       found=max(found,a[mid]);
    

  

现在你知道在这个循环之后,low 将等于 high 所以 print(low) 或 print(high)

【讨论】:

【参考方案2】:

Wayne 的方法是正确的,我对代码做了一些修改。我的代码是用 Java 编写的。 当 a

public static int lessThan(int[] nums, int key)
    if(nums == null || nums.length == 0) return -1;
    int low = 0, high = nums.length -1;
    while(low <= high)
        int mid = (low + high) >> 1;
        if(key <= nums[mid])
            high = mid - 1;
        else 
            low = mid +1;
        
    
    return high;

【讨论】:

以上是关于使用二进制搜索在数组中查找数字的位置的主要内容,如果未能解决你的问题,请参考以下文章

二进制搜索以获取第一个整数的位置> =搜索的整数

算法建议:查找排序数组中的数字计数

数组中的二分查找

在Python中的二进制搜索算法中查找数组的中间索引值

二进制搜索算法:数组中每条记录的文本文件

使用二进制搜索在 C 中查找交错序列