面试复习==华山论剑(一)?二分查找也是病:BSearch
来源:互联网 发布:移动网络玩dota2 编辑:程序博客网 时间:2024/04/29 21:53
看到一篇很有意思的文章就动手解决了一下问题。。。觉得有点意思~正逢毕业VS求职VS面试VS....高峰期,各种潮涌。
《编程珠玑》中的两句话:
- 尽管给了那么充裕的时间,只有大约10%的专业程序员能够写出正确的二分查找。
- 尽管第一个二分查找程序于1946年就公布了,但是第一个没有bug的二分查找程序在1962年才出现。
当时看到这的时候,我觉得有点夸张。这里不去讨论是否真的花了20年才人们才写出正确的代码,但这两句话至少告诉我们,不要小看二分搜索。
确实,写过bsearch的人都知道,迭代的出口很难在短时间内想清楚(反正我经常糊涂)。当然,常规的二分搜索大家现在基本都能写了,(写过这么多次,背也背下来了),但能写出来不代表真正理解了二分搜索。比如我们可以改动一下原型:从一个有序数组中找到大于x且最接近x的数。
说白了就是二分搜索,但是迭代的出口是什么的问题?
一、二分查找算法的原型JAVA代码表示
//传统二分搜索 PS:a数组中的值从小到大排列,找到目标X则返回下标值,未找到则返回-1 public static int bsearch(int[] a, int x) {int l=0,h=a.length -1 ;int m;while(h>=l) {m=(l+h)/2;if(a[m] ==x) {return m;} else if(a[m] <x){l=m+1 ;} else {h=m-1 ;}}System.out.println("l:"+l+" h:"+h);return -1 ;}
考虑一下要查找的元素不在序列中的情况:函数会返回-1,那l和h分别指向什么呢?
可以证明:l指向大于x的第一个元素,r指向小于x的第一个元素。(为什么?迭代的最后一步必然是l和h指向同一元素,然后为什么会变得比h大呢?想想就明白了)
二、变形1
//功能简介: 在有序数组中查找比x大但是最接近x的数//二分搜索 PS:a数组中的值从小到大排列,找到目标X则返回下标值,未找到则返回-1 public static int bsearch_more(int[] a, int x) {int l=0,h=a.length -1 ;int m;while(h>=l) {m=(l+h)/2;if(a[m] ==x) {return (m+1)>a.length-1?-1:m+1;} else if(a[m] <x){l=m+1 ;} else {h=m-1 ;}}System.out.println("l:"+l+" h:"+h);return l ;}
三、变形2
//功能简介: 在有序数组中查找比x小但是最接近x的数//二分搜索 PS:a数组中的值从小到大排列,找到目标X则返回下标值,未找到则返回-1 public static int bsearch_less(int[] a, int x) {int l=0,h=a.length -1 ;int m;while(h>=l) {m=(l+h)/2;if(a[m] ==x) {return (m-1)<0?-1:m-1;} else if(a[m] <x){l=m+1 ;} else {h=m-1 ;}}System.out.println("l:"+l+" h:"+h);return h ;}
附:主函数测试代码JAVA表示
public static void main(String[] args) {// TODO Auto-generated method stub//传统二分搜索int[] a = {1,4,7,9,10,17,20} ;int sign = bsearch(a,11) ;System.out.println(sign);sign = bsearch_more(a, 18) ;System.out.println(a[sign]);sign = bsearch_less(a, 5) ;System.out.println(a[sign]);}
- 面试复习==华山论剑(一)?二分查找也是病:BSearch
- bsearch()函数(二分查找)
- bsearch—二分查找
- sort(排序) qsort(快排) bsearch(二分查找)
- C/C++ 库函数 二分查找 bsearch
- 二分查找bsearch.c源码分析
- Linux内核中的bsearch二分查找函数
- 二分查找算法和二分查找函数bsearch
- 二分查找函数bsearch与排序函数qsort(两个好基友)
- 查找(一)二分查找
- 二分查找(面试必备)
- 二分查找(面试必备)
- 复习之二分查找
- 快速排序qsort()函数和二分查找bsearch()函数
- 查找算法复习(1)--二分查找法
- 二分查找专题(一)
- 思念也是一种病
- 排序与查找(一): 二分查找
- 使用ATJTAGICE3进行debugWIRE调试 (2012-03-03 10:38:47)
- STP协议及其配置(二),共两部分
- eclipse快捷键
- 关于Oracle DB中SQL Script的注释(REM,--,/* */)
- android handle thread runnable的关系
- 面试复习==华山论剑(一)?二分查找也是病:BSearch
- PHP程序员的10个有用的技巧和教程
- ubuntu 12.04 编译添加内核
- Oracle SQL*PLUS基础及sqlplus命令详解-1
- eclipse中的程序无法在真机中运行
- CentOS yum 源的配置与使用
- python实现百度、CSDN、淘宝、人人自动登录(第一季)
- 直接拿来用!最火的Android开源项目(一)
- B从A获得信息的三种模式