我正在编写一个程序来确定为给定数字和排序数组运行二进制搜索算法需要多少次比较。我不明白的是什么算作比较。
// returns the number of comparisons it takes to find key in sorted list, array
public static int binarySearch(int key, int[] array) {
int left = 0;
int mid;
int right = array.length - 1;
int i = 0;
while (true) {
if (left > right) {
mid = -1;
break;
}
else {
mid = (left + right)/2;
if (key < array[mid]) {
i++;
right = mid - 1;
}
else if (key > array[mid]) {
i++;
left = mid + 1;
}
else {
break; // success
}
}
}
return i;
}
该函数返回i,它应该是在数组中查找键时所做的比较总数。但是什么定义了比较?是否有条件?
感谢您的帮助,只是想了解这个概念。
答案 0 :(得分:3)
通常,每次将键与数组元素进行比较时都会进行比较。但是,代码似乎并没有计算出来。它计算一个搜索边界(left
或right
)的更改次数。这与计算的不完全相同,但它非常接近同一个东西,因为边界移动的次数与循环的次数直接相关,因此与进行比较的次数直接相关。最多,两种计数方式将会被1或2计算(我没有理由完全弄明白)。
另请注意,如果要使用通常的定义,则可以重写代码以使用Integer.compare(int,int)
对key
与array[mid]
进行单一比较,以确定是否{{1} }小于,等于或大于key
。
array[mid]