二分法
第2篇个人博客
2023/10/16
1. 如何理解二分法
a.死板的解释
二分法,也称为二分查找,是一种在有序数据集中查找特定值的快速方法。它的思想是将数据集分成两半,然后确定目标值可能在哪一半,从而将搜索范围减半。这个过程不断重复,直到找到目标值或者确定它不存在。
b.通俗易懂的例子
假设你有一本电话号码的电话簿,你想查找其中一个特定的名字。你可以使用二分法来进行查找。
-
打开电话簿的中间页,看名字的第一个字母。现在,你知道你要找的名字是在这个字母之前还是之后。
-
如果名字在这个字母之前,你将把电话簿的后半部分撕掉,只保留前半部分。
-
如果名字在这个字母之后,你将把电话簿的前半部分撕掉,只保留后半部分。
重复这个过程,不断缩小查找范围,直到你找到了名字,或者确定名字不在电话簿中。
二分法的工作方式:将问题分成两半,然后根据你找到的信息继续缩小搜索范围,直到找到答案或确定答案不存在。
2.二分法的使用条件:
a.有序数据集:
二分法只适用于有序的数据集,无论是升序还是降序。因为它利用了数据的有序性质,可以快速缩小搜索范围。
b.可比性:
元素之间必须具有可比性。这意味着你可以比较两个元素,确定一个是否大于、小于或等于另一个。
c.单一目标:
二分法适用于查找单一目标,即要么目标存在于数据集中,要么不存在。它不适用于查找多个目标或范围。
d.随机访问能力:
二分法通常要求能够随机访问数据集中的元素,这意味着你可以直接访问数据集中的任何元素,而不需要按顺序逐个查找。
e.不适用于频繁插入/删除:
如果你的数据集需要频繁插入或删除元素,二分法可能不是最佳选择。因为插入/删除操作可能会破坏数据的有序性,需要维护数据集的有序性。
f.适用于大数据集:
二分法在大型数据集中特别有用,因为它可以在较少的比较操作中快速找到目标,相对于线性搜索(逐个查找)来说效率更高。
3.来写代码
题目:
二分查找猜数字游戏
其中你要猜测一个介于某个范围内的数字。这个游戏的目标是在最少的猜测次数内猜到正确的数字。
(假设要猜的数字范围是1到100)
策略
1.初始化数字范围:最开始,假设数字在1到100之间。
**2.猜测数字:**取当前范围的中间值作为猜测的数字。
3.检查猜测结果:
- 如果猜测的数字正确,游戏结束。
- 如果猜测的数字比目标数字小,更新范围为中间值加一到当前范围的最大值。
- 如果猜测的数字比目标数字大,更新范围为当前范围的最小值到中间值减一。
- 重复步骤2和3,直到猜中目标数字。
C语言示例
#include <stdio.h>
int main() {
int low = 1; // 最小范围
int high = 100; // 最大范围
int targetNumber = 73; // 要猜的目标数字
int guess;
printf("猜数字游戏开始!\n");
while (1) {
// 二分查找
guess = (low + high) / 2;
// 输出猜测的数字
printf("我猜数字是: %d\n", guess);
// 判断猜测结果
if (guess == targetNumber) {
printf("猜中了,目标数字是: %d\n", guess);
break;
} else if (guess < targetNumber) {
low = guess + 1;
} else {
high = guess - 1;
}
}
return 0;
}