使用start > 在二进制搜索中,我们通常具有低和高变量,通常有一个while循环来测试是否低<=高,如以下代码所示(来自Wikipedia:]] int SortedArray[max] = {....} int BinarySearch (int key) { int start = 0; int end = max - 1; int mid; while (start <= end) { mid = (start + end) / 2; if (key == a[mid]) return mid; else if (key < a[mid]) end = mid - 1; else start = mid + 1; } return -1; } [学习二进制搜索时,我总是被教导使用start <= end方法,但是当看到其他实现时,我看到很多人都在while(start 一个相对于另一个有优势吗?在我自己的本机实现中,我使用<=方法,但是当将其切换为 使用一个相对于另一个是否有经验法则? 在二进制搜索中,我们通常具有低和高变量,通常有一个while循环来测试是否低<=高,如以下代码所示(来自Wikipedia):int SortedArray [max] = {....} int ... 即使您的问题可能不是很清楚,我也可以推断您正在谈论二进制搜索的这种实现方式(在C中,来自维基百科): int SortedArray[max] = {....} int BinarySearch (int key) { int start = 0; int end = max - 1; int mid; while (start <= end) { mid = (start + end) / 2; if (key == a[mid]) return mid; else if (key < a[mid]) end = mid - 1; else start = mid + 1; } return -1; } 如果将start <= end替换为start < end,则在某些情况下您的算法将无法给出正确的答案。 让我们考虑两个案例。 1-您想在列表[1]中搜索1。在这种情况下,如果更改循环条件,start = 0, end = 0和算法将返回-1。 2-您想在列表[1, 2]中搜索2。在这种情况下,开始= 0,结束=1。算法将在C中设置mid = (0+1)/2=0。因此arr[mid] < key。它将变为start = 1, end = 1。同样,如果您在此处停止循环,则算法将返回-1而不是1。 而且可能还有许多其他示例。 祝你有美好的一天 对于low <= high,将high视为包含 (high是我们考虑的范围的一部分)。 对于low < high,将high视为独占 (high不属于我们考虑的范围)。 两者都是正确的,但是其余的代码会有细微的差别,特别是high的初始化方式(high = length-1与high = length)以及更新方式(high = mid-1与high = mid)。 哪个更好? 主要区别在于,mid = (low + high) / 2在每种情况下都会略有不同。 [更具体地说,high在排除情况下将大1,因此,当high-low在包括情况下为偶数时,mid将保持不变,但是当high-low在包括情况下为奇数时,在特殊情况下,mid将大1个元素(这是由于四舍五入)。 让我们考虑一个例子: length = 6 low = 0 highInclusive = 5, highExclusive = 6 midInclusive = 5/2 = 2, midExclusive = 6/2 = 3 如您所见,当没有单个中间元素时,一个将在左侧选择该元素,而另一个将在右侧选择该元素。 虽然这有时会使一个速度更快,有时会使另一个速度更快,但平均运行时间几乎是相同的。 [从可读性的角度来看,(在我看来)在具有基于0的数组的语言中使用排他的,而从具有基于1的数组的语言中使用一种,可能会更好一些,以最大程度地减少-1的数量在代码中。也可以提出一个论点,即坚持使用所有语言的单一版本,以免人们理解这两种版本或在两者之间感到困惑。

问题描述 投票:0回答:2

在二进制搜索中,我们通常具有低和高变量,通常有一个while循环来测试是否低<=高,如以下代码所示(来自Wikipedia:]]

int SortedArray[max] = {....}

int BinarySearch (int key)
{
    int start = 0;
    int end = max - 1;
    int mid;
    while (start <= end)
    {
        mid = (start + end) / 2;
        if (key == a[mid])
            return mid;
        else if (key < a[mid])
            end = mid - 1;
        else start = mid + 1;
    }
    return -1;
}

[学习二进制搜索时,我总是被教导使用start <= end方法,但是当看到其他实现时,我看到很多人都在while(start

一个相对于另一个有优势吗?在我自己的本机实现中,我使用<=方法,但是当将其切换为

使用一个相对于另一个是否有经验法则?

在二进制搜索中,我们通常具有低和高变量,通常有一个while循环来测试是否低<=高,如以下代码所示(来自Wikipedia):int SortedArray [max] = {....} int ...

java algorithm binary-search
2个回答
7
投票

即使您的问题可能不是很清楚,我也可以推断您正在谈论二进制搜索的这种实现方式(在C中,来自维基百科):

int SortedArray[max] = {....}

int BinarySearch (int key)
{
    int start = 0;
    int end = max - 1;
    int mid;
    while (start <= end)
    {
        mid = (start + end) / 2;
        if (key == a[mid])
            return mid;
        else if (key < a[mid])
            end = mid - 1;
        else start = mid + 1;
    }
    return -1;
}

1
投票

对于low <= high,将high视为包含

high是我们考虑的范围的一部分)。
© www.soinside.com 2019 - 2024. All rights reserved.