为了账号安全,请及时绑定邮箱和手机 立即绑定

二分法查找

标签:
深度学习

# 二分查找(折半查找)

title: 二分查找
tags: 数据结构与算法之美
author: 辰砂


一、简介

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列 (解释:所以二分查找的时候一定要是有序的数组

二、过程

若k==R[mid].key,查找成功
若k<R[mid].key,则high=mid-1若k>R[mid].key,则low=mid+1

1.查找 21

5be9a4da000168ab13100786.jpg

2.查找70

5be9a4db00017fe411280768.jpg

5be9a4db00018de314160832.jpg

三、算法描述

1.非递归

设表长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定值

初始时,令low=1,high=n,mid=(low+high)/2

让k与mid指向的记录比较

若k==R[mid].key,查找成功

若k<R[mid].key,则high=mid-1

若k>R[mid].key,则low=mid+1

重复上述操作,直至low>high时,查找失败

int Search_Bin(SSTable ST,KeyType key){//若找到,则函数值为该元素在表中的位置,否则为0
    low=1;high=ST.length;                        while(low<=high){
        mid=(low+high)/2;        if(key==ST.R[mid].key) return mid; 
        else if(key<ST.R[mid].key) high=mid-1;//前一子表查找
        else low=mid+1;                             //后一子表查找
    }                                       return 0;       //表中不存在待查元素}

2.递归

int Search_Bin (SSTable ST, keyType key, int low, int high) { 
  if(low>high) return 0;   //查找不到时返回0 
  mid=(low+high)/2; 
  if(key==ST.elem[mid].key)  return mid; 
  else if(key<ST.elem[mid].key)  
    return search_Bin(ST,key,low,mid-1);//递归
  else  return search_Bin(ST,key,mid+1,high); //递归}

3、完整代码

public class BinarySearch {    public static void main(String[] args) {        int[] nums = {1, 4, 5, 8, 9};
        System.out.println(binarySearch(nums, 1));
        System.out.println(binarySearchRecursion(nums, 1, 0, nums.length - 1));
    }    /**
     * 循环
     *
     * @param nums
     * @param target
     *
     * @return
     */
    public static int binarySearch(int[] nums, int target) {        if (nums.length < 0) {            return -1;
        }        int left = 0;        int right = nums.length - 1;        while (left <= right) {            int mid = (left - right) / 2 + right;            if (target == nums[mid]) {                return mid;
            } else if (target > nums[mid]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }        return -1;
    }    /**
     * 递归
     *
     * @param nums
     * @param target
     * @param left
     * @param right
     *
     * @return
     */
    public static int binarySearchRecursion(int[] nums, int target, int left, int right) {        if (nums.length < 0 || left < 0 || right > nums.length - 1) {            return -1;
        }        int mid = (left - right) / 2 + right;        if (left <= right) {            if (target == nums[mid]) {                return mid;
            } else if (target > nums[mid]) {                return binarySearchRecursion(nums, target, mid + 1, right);
            } else {                return binarySearchRecursion(nums, target, left, mid - 1);
            }
        }        return -1;
    }

四、折半查找的性能分析

判定树:树中每个结点表示表中一个记录,结点中的值为该记录在表中的位置,通常称这个查找过程的二叉树称为判定树。折半查找法在成功时进行比较的关键字个数最多不超过树的深度。(折半查找的运行过程可以用二叉树来描述,这棵树通常称为“判定树”)

关键字的平均比较次数,也称平均搜索长度ASL(Average Search Length)

5be9a4dc000112ca14040650.jpg

如上图而言是11个节点
5be9a4dc000106f914580710.jpg

假设概率都相等的情况下:ASL=1/11(11+2×2+4×3+4*4 )=33/11=3
查找成功时比较次数:为该结点在判定树上的层次数,不超过树的深度 d =  log2 n  + 1
查找不成功的过程就是走了一条从根结点到外部结点的路径d或d-1。

查找过程:每次将待查记录所在区间缩小一半,比顺序查找效率高,时间复杂度O(log2 n)

适用条件:采用顺序存储结构的有序表,不宜用于链式结构

五、优化

由上面可以知道二分法的代码的核心

mid=(low+high)/2;if(key==ST.R[mid].key) return mid; 
 else if(key<ST.R[mid].key) high=mid-1;//前一子表查找
  else low=mid+1;

思考:极端情况下会不会产生数组溢出,答案是肯定的,因为极端情况下,当high为int类型的临界最大值的时候,low只要变化,两者相加肯定会溢出。为了效率更高,我们也可以用位运算,

改进代码:

int mid = (left - right) >> 2 + right;

六、二分法练习

https://leetcode.com/problemset/all/?topicSlugs=binary-search


参考

https://www.cnblogs.com/ciyeer/p/9065781.html

原文出处: https://www.cnblogs.com/tojian/p/9934073.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中

胡说叔叔

手记
粉丝
129
获赞与收藏
581

关注作者,订阅最新文章

阅读免费教程

  • 后端通用面试教程
    41个小节 28721 323
  • 网络编程入门教程
    20个小节 11934 226
  • Pandas 入门教程
    25个小节 17383 314
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 分销返利 帮助中心 APP下载
官方微信
返回顶部

举报

0/150
提交
取消

资讯网彼岸花种家里好吗曾德起名大全蚂蚁雄兵超级seo永城无烟煤价格网站架构与设计吉姓起名卑微网名梦见画像 周公解梦下载电影天堂2019最新版开学了的作文广东企业网站制作哪家游戏网站的制作教程成都网站建设搭建舒蕾洗发水怎么样姓余男人起名字卵蛋关于家乡的作文朝鲜足球敕勒歌古诗新生儿起名字大全男宝2个月的宝宝们男孩起什么小名宝宝起名网那个好德阳企业网站制作生猪宝宝张姓起名大全曹氏姑娘起名手机游戏制作网站安庆网站建设公司起名专家姓名测试睢县城郊乡派出所昕的字起名寓意少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

资讯网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化