【问题标题】:Iterative binary search with only two comparisons?只有两次比较的迭代二分搜索?
【发布时间】:2018-08-10 04:14:27
【问题描述】:

调整迭代二分搜索代码,使其只使用两次比较而不是三个(在 主while循环)。 *注:三个比较在while循环中,两个if语句 在循环内。

#include <stdio.h>

int ItBinarySearch(int arr[], int len, int target) {

    int first = 0;
    int last = len-1;

    while (first <= last){
        // Assert: array is sorted
        int mid = (first+last) / 2;

        if (target == arr[mid])
            return 1;

        if (target < arr[mid])
            last = mid-1;

        else first = mid+1;
    }
    return 0;
}

int main(void){
    int arr[6]={0,1,2,3,4,5};
    int len=sizeof(arr)/sizeof(arr[0]);
    int target = 4;
    printf("%d\n",ItBinarySearch(arr,len,target));
}

【问题讨论】:

  • 不确定你认为你需要做什么。根据定义,二分搜索需要 O(log2(n)) 次比较。比较是您在任何时候使用 ==、>、数据值(比较 first 和 last 等索引不计算在内)。
  • 比较是指比较两件事。我假设在这种情况下,比较是每个if,每个else 每个while,因为您在那里进行比较。我猜老师是想让你重写函数,这样在函数中只能找​​到两个比较。
  • @LeeDanielCrocker 如果比较第一个和最后一个不算数,那么它不是已经有 2 个比较了吗?一个用于目标 == arr[mid],一个用于目标
  • 是的,循环内部有两次比较,循环很可能会运行O(log2(n))次。
  • @Pablo 您的回答似乎与李的不同。我有点困惑。

标签: c binary-search


【解决方案1】:

提示:尝试将 if/else 语句之一移出循环。如果算法在语句之外,哪个 if/else 最有可能仍然有效?

【讨论】:

  • 谢谢!我刚刚移动了 == 语句,它起作用了!
猜你喜欢
  • 2011-03-30
  • 2014-06-21
  • 2023-01-13
  • 2011-06-24
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多