首页 > 代码库 > 二分法
二分法
一、定义
二分查找 又称为折半查找 , 是一种查找效率较高的方法 。
要求 : 1 . 所查找的序列为有序序列
2. 只能在顺序存储结构上实现
二、基本思想
每次将给定的 key 值与有序表中间位置上记录的数据进行比较 ,确定待查记录所在的范围 , 然后逐渐缩小查找范围 , 直到确定找到或找不到 。
三、查找过程
每次执行的操作是将 key 依次与 mid 对应的数据进行比较 。
代码示例 :
非递归版本
/*******************************/ // 非递归版的二分法 void search ( int low , int high , int key ) { while ( low <= high ) { int mid = ( low + high ) / 2 ; if ( key == a[mid] ) { cout << "找到" ; return ; // return 的作用是为了跳出函数,并且返回值为空类型 } if ( key > a[mid] ) low = mid + 1 ; else high = mid - 1 ; } cout << "未找到" ; // 若前面所要找的数未找到,则函数不会返回,此时会执行到这一步。 }
递归版本
/*******************************/ // 递归版的二分法 void search ( int low , int high , int key ) { int mid = ( low + high ) / 2 ; if ( low >= high ) { cout << "未找到" ; return ; } if ( a[mid] == key ) { cout << "找到" ; return ; } if ( a[mid] > key ) search ( low , mid - 1 , key ) ; else search ( mid + 1 , high , key ) ; }
时间复杂度:
由于二分法每次是折半分 , 设复杂度为 k , 二分的所有数据总数为 n , 则 2^k = n , 复杂度 k = lg n 。
例题 :
问题描述
有N个城市,每个城市有Ai个人。
现在要开始投票,每个人有一张票。
作为领导者,你有B个箱子,你必须要将这B个箱子分发到N个城市去,每个城市至少需要一个箱子。
每个人都必须要投票,不能弃票,也就是说要把票丢进箱子里去(每个城市有Ai张票)。
现在问你,怎么分配这B个箱子才能使这些所有箱子里中票数最大的那个箱子里的票最少?
输入
输入包含一个数N(1<=N<=500,000)和B(N<=B<=2,000,000)。
接下来N行包含N个数,每个数Ai(1<=Ai<=5,000,000)表示每个城市的人数。
输入N为-1,B为-1时结束。
输出
输出那个带兵量最多的将领所带的士兵数。
样例输入
2 7
200000
500000
4 6
120
2680
3400
200
-1 -1
样例输出
100000
1700
二分法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。