Files
hsa/Html/books/markdown/algorithm/binary_search.md
2025-01-01 01:43:28 +08:00

1.9 KiB
Raw Blame History

二分查找与二分答案

二分查找

引入

二分是一个很简单基础,但很重要的知识点,为以后许多高级的数据结构与算法铺垫。

下面是一个用二分的简单场景:

假设小明从0到1000之间选择了一个数字但不告诉你你可以不断猜测这个数每次猜测小明会告知你的猜测得过大还是过小问最多几次就一定能猜中

答案是利用二分查找的原理猜测11次即可。

  1. 对于0到1000的答案备选区猜测中位数500假设过小
  2. 则对于501到1000的答案备选区猜测750假设过大
  3. 则对于501到749的答案备选区猜测625假设过小
  4. 则对于626到749区间......
  5. 688-749
  6. 718-749
  7. 734-749
  8. 742-749
  9. 746-749
  10. 748-749
  11. 749-749

在最差的情况下第11次的答案备选区就一定长度为1了也就是必然是答案。

因此如果序列是有序的,就可以通过二分查找快速定位所需要的数据。

思考题询问Agent以学习计算方法或验证你的答案

对于上面那个题目如果问题区间是1到4000最差情况下需要猜测几次

练习:二分查找

试试对于下面的题目,用代码实现一下二分查找。

题目:有序数组寻址

给出一个长度为n的有序数组从小到大有q次询问对于每次询问输出指定数在数组中的下标。如果不存在则输出-1。

输入

第一行一个整数n。(1<=n<=10^5)

第二行n个用空格分开的整数ai。(0<=ai<=10^8)

第三行一个整数q表示询问的次数。(1<=q<=10^4)

后q行每行一个整数b表示询问的数。(0<=b<=10^8)

输出

q行每行一个整数对应每次询问的返回结果。

提示:

完成代码后通知Agent进行评测。

如果你还不完全会这个算法询问Agent获取提示并进行学习。