你真的完全理解二分查找了吗
来源:互联网 发布:云计算专业调研报告 编辑:程序博客网 时间:2024/05/09 16:30
首先,连二分查找都不知道的同学请戳这里。
那么让我们一起写个二分查找的程序吧。
现在有一个从小到大排好序的a数组,要从中查找数x。
首先可以轻松的写出:
void binary_search(int l,int r,int x){
接下来的while循环怎么写呢?while (l<r)
吗?还是while (l<=r)
?还是别的什么呢?然后纠结了一会儿(这就说明你并未完全理解二查)。
好,总算写好了。
然后也很简单:int mid=l+(r-l)/2;
接下来呢?if (a[mid]>x)
?if (a[mid]>=x)
?选哪个呢?这个还稍微简单些,接下来的语句呢?r=mid
?或者r=mid-1
?有对r的赋值自然也得有对l的赋值,这里又出现问题了:是l=mid
还是l=mid+1
呢?然后又得琢磨一会儿,时间就这么消失了。
最后输出l还是r呢?这得因题而异。
这还仅仅是最基础的题目,如果在实际应用中遇上形如二分最优解+贪心验证类的题目,思考的时间会不会更长?错误率会不会更高?所以好好理解一下它吧。
另外附上二分查找的代码:
void binary_search(int l,int r,int x){ while (l<=r) { mid=l+(r-l)/2; if (a[mid]==x) return mid; if (a[mid]>x) r=mid-1; else l=mid+1; } return -1;}
细心的同学可能注意到,对于mid的赋值与常见的(l+r)/2有些不同。从数学的角度来说,这两个式子是完全等价的(不清楚的线下拿笔和纸解决)。但是对于某些实际应用,mid=(l+r)/2
就可能爆掉,因为l+r可能超出了整形范围(如果你开long long我就无话可说)。
——–分—-割—-线——–
看到这里,你还觉得二分查找很水吗?
3 0
- 你真的完全理解二分查找了吗
- 二分查找,你真的掌握了吗?
- 二分查找,你真的掌握了吗?
- 二分查找,你真的掌握了吗?
- 二分查找,你真的掌握了吗?
- 二分查找--你真的掌握了吗?
- 二分查找,你真的掌握了吗?
- 二分查找,你真的掌握了吗?
- 你真的会二分查找吗?
- 你真的会二分查找吗?
- 二分查找,你真的会吗?
- 二分查找,你真的会吗?
- 你真的会二分查找吗?
- 你真的会二分查找吗?
- 你真的会二分查找吗?
- 你真的会二分查找吗?
- 你真的会二分查找吗?
- 你真的会二分查找吗?
- java反射机制简单应用
- VS2015 使用Mysql-connector/c++ 链接数据库(环境配置)
- ssh项目中strust2从2.0.11升级到2.3.15.1详细步骤
- 负载均衡算法
- Contiki中MAC层与RDC层
- 你真的完全理解二分查找了吗
- CallableAndFuture
- JS面向对像编程四—— prototype 对象
- JQuery选择器(二) 层次选择器
- 移动端背景音乐js
- 解决 javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
- ora-12505错误
- #628 – 当使用ALT键的时候按键事件序列(Key Up/Down Sequence When Using ALT Key)
- COMET介绍