范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

秒懂如何运用二分查找算法

  上篇我们讲解了八种排序算法的原理,本文再深度剖析如何运用二分查找算法。一、二分查找的实现
  对于给定的已经有序的数列,我们需要在该数列中查找是否存在某个元素。
  每次都与数列最中间的元素进行比较,可以缩小一半的查找区间,直至找到目标元素或者区间被缩小为0,元素不存在。比如下面的数列中,我们想要查找元素19,那么大致的过程就是这样的:
  二分查找过程示意图
  使用代码实现如下:     public static void main(String[] args) {         int[] data = {8, 11, 19, 23, 27, 33, 45, 55, 67, 98};         int result = binarySearch(data, data.length, 19);         log.info("查找元素19的位置是:{}", result);     }      public static int binarySearch(int[] data, int size, int target) {         int low = 0;         int high = size - 1;          while (low <= high) {             int middle = (low + high) / 2;             if (data[middle] == target) {                 return middle;             } else if (data[middle] < target) {                 low = middle + 1;             } else {                 high = middle - 1;             }         }          log.info("元素{}查找不存在!", target);         return -1;     }
  二分查找的时间复杂度是O(logn),对数阶时间复杂度的算法效率非常高。 二、二分查找的特点及使用场景
  二分查找必须依赖以下条件才能发挥作用: 数据结构一定要是顺序表,比如数组。如果是不支持随机访问的数据结构,那么二分查找就无法使用; 待查找的数列一定要是有序的。如果给定的数列是无序的,那么我们就必须先使用排序算法将数列进行排序,否则也无法使用二分查找; 不适合频繁插入和删除的数列;因为数列需要保持有序,要么在插入和删除的时候保证有序,要么在插入数列后使用排序算法进行排序,这些都是时间开销; 不适合数据量太小的数列;数列太小,直接顺序遍历说不定更快,也更简单;但是有一种场景除外,就是每次元素与元素的比较是比较耗时的,这个比较操作耗时占整个遍历算法时间的大部分,那么使用二分查找就能有效减少元素比较的次数,从而节约时间; 不适合数据量太大的数列;二分查找作用的数据结构是顺序表,也就是数组,数组是需要连续的内存空间的,系统并不一定有这么大的连续内存空间可以使用; 三、二分查找相关的变体
  查找第一个等于给定值的元素     public static void main(String[] args) {         int[] data = {8, 11, 19, 19, 19, 33, 45, 55, 67, 98};         int result = binarySearch1(data, data.length, 19);         log.info("查找元素19的位置是:{}", result);     }      public static int binarySearch1(int[] data, int size, int target) {         int low = 0;         int high = size - 1;         while(low <= high){             int middle = (low + high) / 2;             if(data[middle] > target){                 high = middle - 1;             } else if(data[middle] < target){                 low = middle + 1;             } else {                 // 当前元素等于目标元素,但是不一定是第一个等于目标元素的                 if((middle == 0) || (data[middle-1] != target)){                     // 说明当前middle是第一个等于目标元素的                     return middle;                 } else {                     // 继续在middle的前半区间进行查找                     high = middle - 1;                 }             }         }         return -1;     }
  查找最后一个等于给定值的元素 else {                 // 当前元素等于目标元素,但是不一定是最后一个等于目标元素的                 if((middle == size-1) || (data[middle+1] != target)){                     // 说明当前middle是最后一个等于目标元素的                     return middle;                 } else {                     // 继续在middle的后半区间进行查找                     low = middle + 1;                 } }
  查找第一个大于等于给定值的元素 public static int binarySearch3(int[] data, int size, int target) {         int low = 0;         int high = size - 1;         while(low <= high){             int middle = (low + high) / 2;             if(data[middle] >= target){                 if(middle == 0 || data[middle-1] < target){                     // 是第一个大于等于target的位置                     return middle;                 } else {                     // 继续往middle的前半部分去找                     high = middle - 1;                 }             } else {                 // 继续往middle的后半部分去找                 low = middle + 1;             }         }         return -1;     }
  查找最后一个小于等于给定值的元素 public static int binarySearch4(int[] data, int size, int target) {         int low = 0;         int high = size - 1;         while(low <= high){             int middle = (low + high) / 2;             if(data[middle] <= target){                 if(middle == (size-1) || data[middle+1] > target){                     return middle;                 } else {                     low = middle + 1;                 }             } else {                 high = middle - 1;             }         }         return -1;     }四、总结
  在实际的查找业务场景中,凡是可以使用二分查找的问题都可以使用散列表和二叉查找树来完成,而且后面两者的使用频率要更高。
  什么情况下才使用二分查找呢?用于求解近似查找的问题上,比如上面描述的四种二分查找变体问题,而这类问题使用散列表、二叉查找树或者别的数据结构和算法就不太好实现。

100款新国标奶粉维生素D大盘点,它对宝宝竟如此重要!最近正值春季补钙补维生素D的关键时期,而总有妈妈在为宝宝选择补剂时忽略了其实奶粉中就含有丰富的维生素D。目前新国标已经正式实施,有28家乳企,100个品牌,旗下294款产品通过新国宝宝缺钙又到了一年一度的春长了,好多家长都想利用这个春季给孩子多补充营养,好长身体,朋友的孩子却总不长个子,前些日子去检查身体说是缺钙,咨询医生说主要有以下几个病因1。户外运动,晒太阳太少宝宝春季吃什么丝瓜蒸牛肉食材牛肉丝瓜葱姜做法1。牛肉清洗干净切薄片,越薄越嫩,加入葱姜淀粉酱油蚝油抓匀,再加入少许辅食油抓匀腌制10分钟备用。2。丝瓜去皮切滚刀块,再加入少许盐拌匀,放入碗中,腌无畏契约控场者守卫前锋决斗者,全角色ampampamp技能介绍无畏契约相信玩游戏的都很熟悉了,以前都是翻墙去玩,21年9月腾讯引进了这款游戏,但一直等到现在还没上。据悉是今年2023年会上线,但还不确定时间,不过我们可以先来了解一下这款游戏的虞姬完美出装怎么现在还有人玩虞姬在出破晓啊。绝大数人都在误导你对虞姬的理解,玩虞姬所遇到的问题就是发育慢伤害低,尤其是出破晓的时候,不仅装备成型特别慢,而且它的攻速加成在后期对虞姬没有任何提升王者荣耀雅典娜和关羽相对比,你更喜欢哪个?关羽被动技能一骑当千关羽每主动移动一段距离,速度将得到提升,移动达到更远距离时进入冲锋姿态,冲锋时造成普攻伤害并额外附带自身最大生命值的百分比物理伤害。技能1单刀赴会关羽旋转大刀对三国群英传2不分敌我的武将技伏焰游戏新春创作纪三国群英传2中有各种各样的武将技,其中大部分武将技是分敌我的,只对自己有利,对敌方不利,但是也有很少的几个武将技是不分敌我的,其中伏焰这个武将技最常见。伏焰,在平坦的王者荣耀中伽罗和蔡文姬哪个厉害呢?伽罗和蔡文姬是一对非常不错的下路组合,如果将两者分开的话,伽罗要强于蔡文姬,因为蔡文姬本身伤害不足。蔡文姬最大的特点是帮助队友回血,它的技能缺乏伤害,即便是出全法装的蔡文姬,也很难吃饭九忌一忌吃得过饱。进食过量,超过了胃肠道的消化能力,时间长了,会使胃功能下降。二忌吃得太快。吃饭太快,唾液不能充分和食物混合,不利于消化。三忌分神。吃饭时不要看书报电视电脑玩手机或高声原来提肛运动的好处这么多,一起来科普一下吧养生是人们经常挂在嘴边的一句话,不管是在生活中,还是在工作中,很多人都喜欢用一些养生的小妙招来保养身体,比如泡脚艾灸喝枸杞水等等。今天要给大家介绍的是提肛运动,可能有些人对这个比较低钠盐加碘盐无碘盐吃哪种盐更有利健康?一文了解根据2022年世界减盐周的报告显示,2017年全球因高盐饮食死亡的人数达300万人,在我国死亡人数达165万人。尤其是那些平时吃盐多口味重血压高的人群,其实只要换一种盐,就能够很大
消博镜距离满满的科技感!消博会上感受科技改变生活新海南客户端海南国际传播网中英俄三语直击第二届中国国际消费品博览会新海南客户端南海网南国都市报7月28日消息(记者汪承贤)正在如火如荼地举行的消博会上,有很多科技感满满的展品。现场你的理想,你的目标,你的奋斗终点或许只是人家的起点写这篇文章,是因为最近身边的几件事1高考结束,表侄女的高考分数也出来了,300多分,发挥非常失常,然而却不打算复读,准备那个学校录取了就直接去,12年的奋斗,以这样的方式结束,倍感使用JavaScript和CSS做一个图片转PDF的转换器这是一个简单的JavaScript项目,可以将图片转换为PDF文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为PDF文件。但是,除了图片之外,没有其他文件可以在此处转全身麻醉相当于死过一次?被全麻之后,身体会经历哪些变化?46岁的王阿姨最近感到十分焦虑,甚至茶不思饭不想,就连睡觉都睡不好,整日精神恍惚一问才知道,原来是王阿姨前段时间刚检查出患病,医生和她说马上要做一场全麻手术。但是王阿姨早就听经历过农村这野果内有奶汁,含钙比牛奶还高,别忘了去摘随着天气一天天热起来,不仅各种应季水果大量成熟上市,就连野果也都纷纷成熟,吸引着人们去采摘来吃。其实在现在的农村里,这些野果也是有的,只不过很多朋友因为在外工作,无法亲自去采摘,就王迅的妻子王依梓本以为打败原配就能做正宫,没想到活成了笑话文丨柠一编辑丨娱阿姨王迅是一位演员。但他最出名的作品应该是综艺极限挑战。在此之前,他已经跑了十多年的龙套。一朝成名后,王迅做的第一件事,就是和发妻魏臻离婚。当时,魏臻已经为王迅操劳郭台铭也没想到,库克会带着富士康重返大陆,卷土重来?苹果一度和富士康在中国国内共同打造加工厂,而后富士康老总郭台铭突然之间撤离中国,想用更低的成本在印度开厂。但他的印度厂如梦般巡回了一圈,便因现实被迫重返大陆,让人出乎意料。最初的选少年派2越看越好看,2名配角过分优秀,张嘉益也被抢了风头今年国剧市场上接连不断地推出生活类剧作,其中热度表现最为出彩的是心居,不过这部剧集到了后期口碑直线下降,依然是有热度没口碑。但刚刚上线的少年派2却打破了国产生活剧的口碑瓶颈,上线后全民数字素养与技能提升平台正式上线近日,第五届数字中国建设峰会跨越数字鸿沟全民数字素养与数字乡村论坛在福州召开,论坛由国家互联网信息办公室中央党校(国家行政学院)工业和信息化部中华全国妇女联合会中国残疾人联合会公共安徽省七条规划中的铁路的线路走向这是新整理出规划中途经安徽省的七条铁路,其中有高速铁路城际铁路和普速铁路,分别是蚌埠经明光滁州至南京城际铁路合肥至新桥机场至六安铁路亳州至蒙城铁路六安至潜山至安庆铁路庐江经枞阳至池我国福建号航母于今年6月下水,背后黑科技仅中美两国掌握6月17日,我国首艘弹射型航空母舰完全由中国自主设计建造的福建号航母下水,背后的黑科技仅中美两国掌握电磁弹射起飞航空母舰通常有2种起飞模式第一种是滑跃式起飞,这是一种传统的起飞方式