您的足迹:首页 > 语言程序 >如何写出正确的二分法以及分析

如何写出正确的二分法以及分析

二分法在平时经常用到,除了查找某个key的下标以外,还有很多变形的形式。比如 STL 里的 lower_bound,upper_bound

总结一下注意点,有这么几个:

  • 数组是非递增还是非递减
  • 结束条件,即while (condition) 应当是<还是<=
  • 求mid应当是偏向左还是右,即 mid = (left + right) » 1, 还是 mid = (left + right + 1) » 1
  • 如何得到循环不变式
  • while结束后是否需要判断一次条件

整理了下常见的几个问题如下:

  1. 查找值key的下标,如果不存在返回-1.
  2. 查找值key第一次出现的下标x,如果不存在返回-1.
  3. 查找值key最后一次出现的下标x,如果不存在返回-1.
  4. 查找刚好小于key的元素下标x,如果不存在返回-1.
  5. 查找刚好大于key的元素下标x,如果不存在返回-1,等价于std::upper_bound.
  6. 查找第一个>=key的下标,如果不存在返回-1,等价于std::lower_bound.

leetcode上也有很多类似的题目。例如:Search a 2D Matrix

二分查找,必须条件是有序数组,然后不断折半,几乎每次循环都可以降低一半左右的数据量。因此是O(lgN)的方法,要注意的是二分查找要能够退出,不能陷入死循环。

二分查找用到的一个重要定义就是循环不变式,顾名思义,就是在循环中不会改变这么一个性质。举个例子,插入排序,不断的循环到新的索引,但保持前面的排序性质不变。其实就是数学归纳法,具体的定义不用管,我们在第一个例子里看下。

1. 查找值为key的下标,如果不存在返回-1.

先看一下伪代码:

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)

关于我们 - 联系我们 - 留言反馈

站内所有资源仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己承担!

免责声明:本站所有内容来源于互联网。如果本站部分内容侵犯您的权益,请您告知,站长会立即处理。

Powered by emlog

京ICP备15021761号-1

sitemap