开篇
在之前的文章其二:使用递归法实现二分搜索 中,我们实现了递归的二分搜索程序。今天,我们更进一步,来探讨二分搜索的执行次数。
问题概要
给你的二分搜索程序添加虚拟的“计时变量”来计算程序执行的比较次数,并使用程序验证技术来证明其运行时间确实是对数的。
思路分析
相比之前的代码,这个问题并没有特别复杂的逻辑,重点就是增加一个用来计算次数的变量,在每次比较前完成对次数的自增。
值得一提的是,查找t是否在数组x[]中,比较次数最大为log2(n)+ 1,而不是log2(n)。这里的原因我也没搞清楚,希望有大佬指教。
还有一点值得注意的是,因为是对数次——log2(n),若无法拿到整数,则直接向上取整。比如说如果x[]的长度为6,log2(6)的值比2大,比3小,则最大比较次数应该是3+1=4。
代码实现
#include <stdio.h>int comparisons = 0; // 初始化比较次数int binary_search_plus_pro(int x[], int l, int u, int t) {if (l > u) {return -1;}int m = (l + u) / 2;comparisons++; // 增加比较次数if (x[m] == t) {//while (m > 0 && x[m - 1] == t) {m--;}return m;}else if (x[m] < t) {return binary_search_plus_pro(x, m + 1, u, t);}else {return binary_search_plus_pro(x, l, m - 1, t);}
}int main() {int x[] = { 2, 6, 8, 18 };int n = sizeof(x) / sizeof(x[0]);int t = 18;comparisons = 0;int result = binary_search_plus_pro(x, 0, n - 1, t);if (result != -1) {printf("%d在数组中第一次出现的位置是%d.\n", t, result);}else {printf("%d不存在于数组中.\n", t);}printf("比较次数: %d\n", comparisons);return 0;
}
注
以上,便是本篇文章的全部内容了,希望对您有所帮助。
顺带提一句,《编程珠玑》这本书真的很不错,虽然阅读起来进度十分缓慢,但确实让我有所提升,值得推荐!