【问题标题】:Binary search to search element greater than or equal to a given key对大于或等于给定键的元素进行二分查找
【发布时间】:2019-03-19 03:34:46
【问题描述】:

我的代码 sn-p 是:

int bs_greaterthan_or_equal(int *a, int key, int low, int high) {
    while(low<high) {
    int mid = low +(high-low)/2.0;
    if(a[mid]<key) {
    low = mid + 1;
    }
    else high = mid;
    }

    return high;
}

但即使我搜索一个大于数组中最后一个元素的数字,它也会返回最后一个索引

例如 a[] = {1,3,10,15,20,25,27} 键 = 28 它返回 7

【问题讨论】:

    标签: search binary


    【解决方案1】:

    但即使我搜索一个大于数组中最后一个元素的数字,它也会返回最后一个索引

    因为这就是它的设计目的。从技术上讲,它返回最后一个索引 + 1。

    注意条件:

    if(a[mid]<key) {
    low = mid + 1;
    }
    

    当查找大于(或等于)数组最后一个元素的元素时,上述条件将始终为真。当您到达最后一个元素本身时循环终止,其中low 设置为比最后一个索引多一个。

    当您在示例中搜索键 28 时,low 会重复更新,因为上述条件始终为真。当mid等于6,那么a[mid]还是小于28,所以low设置为mid + 1,即7。此时lowhigh变为相等(注意high从未修改过)并且循环终止。函数返回 7。

    如果您希望在搜索大于或等于数组中最后一个元素的数字时返回特定内容(例如,-1),您可以按如下方式修改您的代码。

    int bs_greaterthan_or_equal(int *a, int key, int low, int high) {
        int max_limit = high;
        while(low<high) {
        int mid = low +(high-low)/2.0;
        if(a[mid]<key) {
        low = mid + 1;
        }
        else high = mid;
        }
    
        return high == max_limit ? -1 : high;
    }
    

    如果数组包含给定键的更大或相等元素,high 将存储其索引。否则,最后,high 将保持等于max_limit,这意味着搜索过程找不到这样的元素,因此将返回 -1。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多