所以我想知道,在我的书中,递归二元搜索实现如下:
private static int bin(int[] arr, int low, int high, int target){
counter++; //ignore this, it was to count how many calls this function invocated
if(low > high) return -1;
else{
int mid = (low+high) / 2;
if(target == arr[mid]) return mid;
else if(target < arr[mid]) return bin(arr, low, mid-1, target);
else return bin(arr, mid + 1, high, target);
}
}
它说&#34;如果n,元素的数量,是2的幂,表示n为2的幂...情况3:键不在数组中,其值在于在[0]和[n-1]之间。这里确定键不在数组中的比较次数等于指数。与最坏情况相比,将会少一个比较。&#34;
但是当我坐下来找到使用数组{1,2,3,4,5,6,7,9}和8键的函数调用次数时,调用次数为4.该书说比较的数量是3(不包括我猜的第3行?),但我非常确定函数调用的数量是4.我还将其推广到二进制搜索的迭代实现并概括为迭代次数或递归函数调用始终为floor(log base 2(n))+ 1.
可以解释一下这里发生了什么吗?
答案 0 :(得分:0)
仅进行了3次target == arr[mid]
次比较。在第四次迭代中,达到了基本情况if(low > high)
,因此永远不会进行比较。如你所述:&#34;这里确定密钥不在数组中的比较次数等于指数。&#34;你是对的,因为我们没有处理第3行的比较声明。我们只关注目标值的比较声明。
让我们看看迭代,直到达到2个基本案例中的任何一个。
对数组8
{1,2,3,4,5,6,7,9}
进行二进制搜索
第一次迭代:
low = 0
high = 7
mid = 3
arr[mid] = 4
(target == arr[mid]) == false
第二次迭代:
low = 4
high = 7
mid = 5
arr[mid] = 6
(target == arr[mid]) == false
第三次迭代:
low = 7
high = 7
mid = 7
arr[mid] = 7
(target == arr[mid]) == false
Forth迭代:
low = 8
high = 7
low > high == true
此外,Big O表示法是O(log n)。大O中的+ 1被认为是微不足道的,因此不计算在内。有关Big O功能从最快到最慢的顺序,请参阅维基百科上的this list。