在编程界里,二分是一个十分热门、实用 的一个算法,学好了二分,可以提高枚举的效率,并且简单易懂,超实用哦!有错误的地方望大神指点(^_^) 参考书籍:《信息学奥赛一本通(c++版)》
Q1什么是二分?
二分,有一个别名:分治算法。顾名思义,就是把问题分割成几个较小的问题,从而达到二分的目的——减少时间。
Q2二分的注意事项
(一)设定变量
二分的变量主要是由以下几个组成的:
1:left(或简称L) //枚举的左边界
2:right(或简称R) //枚举的右边界
3:mid(或简称m)//指向左边界和右边界的中间
4:需要枚举的数组(下面简称a数组),最好是升序的
(二)变量初值
1:left=1或需要枚举的数组的最小下标(通常是1或者0)
2:right=需要枚举的数组的最大下标(下面就有n表示)
3:mid是在枚举的过程中赋值的,下面详细讲
Q3算法思路
1:使用一个while循环,条件是在left<=right的情况下运行
2:将mid赋为(left+right)/2
3:以mid为枚举下标,判断a[mid]是否达到条件
4:如果达到条件,将left赋值为mid+1;
5:如果没有达到条件,则right赋值为mid-1;
Q4基本框架
好了,光说不练假把式,所以,小编将给出一道题实践一下:
一个小游戏:输入两个数:n,m(,),并输入一个数组a,共m个元素,(保证为升序),求n在数组a中在什么位置。(如果不包含n则输出“NO!”不包含引号)
样例输入:
3 6
1 3 6 7 8 9
样例输出:
2
分析题目:
首先,它是求一个元素在一个数组里是什么位置,并且数组是一个升序,就可以使用二分法进行搜索。如果用普通的搜索方法从~,效率就低很多。那么现在我们讲一下如何将二分法运用其中:
1、基本变量left=1,right=m。
2、判断条件:如果a[mid]=n的情况下,那么输出mid,退出;如果a[mid]>n的情况下,将右边界缩小到mid-1(因为a数组是一个升序的数组,所以,如果a[mid]>n,则要将范围缩小到left~mid-1,故将right=mid-1,如果不能理解,就多读几遍吧~ 。~);同理,如果a[mid]<n的情况下,那就将left=mid+1。 这样以来,不断地缩小范围,如果相等则输出并退出,是不是减少了时间复杂度呢?
3、没什么好说的,上代码:
好了,讲了那么多,是时候说再见了T_T,如果这篇文章对你有所帮助,求点赞,下面,小编由衷的告诫读者,思路很重要!!!!多刷刷题,总是没错的^_^,再见啦!