ACM:二分查找,以及利用二分法来找上下界

(一)二分的模版:

int binary_search(int *array, int length, int key) {
	int start = 0, end = length - 1;
	while(end >= start) {
		int middle = start + (end - start) / 2;
		int tmp = array[middle];
		if(tmp < key) start = middle + 1;
		else if (tmp > key) end = middle - 1;
		else return middle;
	}
	return -1;
}

(二)

#include<stdio.h>
#include<assert.h>

int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

int bsearch(int* A, int x, int y, int v) {
  int m;
  while(x < y) {
    m = x+(y-x)/2;
    if(A[m] == v) return m;
    else if(A[m] > v) y = m;
    else x = m+1;
  }
  return -1;
}

int main() {
  int i;
  for(i = 1; i <= 11; i++)
    assert(bsearch(A, 0, 11, i) == i-1);
  printf("Ok!\n");
  return 0;
}

(三)利用二分法找上下界

#include<stdio.h>
#include<assert.h>
#include <iostream>
using namespace std;

int A[] = {1, 2, 3, 3, 3, 3, 3, 5, 6};

int lower_bound(int *array, int length, int v) {
  int start = 0, end = length - 1;
  while(start <= end) {
    int middle = start + (end - start) / 2;
    int tmp = array[middle];
    if(array[middle] >= v) end = middle - 1;
    else start = middle + 1;
  }
  return start;
}

int upper_bound(int *array, int length, int v) {
  int start = 0, end = length-1;
  while(start <= end) {
    int middle = start + (end - start) / 2;
    int tmp = array[middle];
    if(array[middle] <= v) start = middle + 1;
    else end = middle - 1;
  }
  return start;
}

int main() {
  cout << lower_bound(A, 9, 3) << endl
	   << upper_bound(A, 9, 3) << endl;
  return 0;
}

ACM:二分查找,以及利用二分法来找上下界

时间: 2024-10-12 22:35:38

ACM:二分查找,以及利用二分法来找上下界的相关文章

二分求解 三角形 stl的应用 涉及范围的二分查找可以先求上界再算下界,结果即上界减下界

二分 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Description You are given N sticks having distinct lengths; you have to form some triangles using the sticks. A triangle is valid if its area is positive. Your task is to f

二分查找 : 那个隐藏了 10 年的 Java Bug

一个偶然的机会,我想起以前还在谷歌上班的时候,有时候大家会在饭桌上讨论最新想出来的一些面试题.在众多有趣又有难度的题目中,有一道老题却是大家都纷纷选择避开的,那就是去实现二分查找. 因为它很好写,却很难写对.可以想象问了这道题后,在5分钟之内面试的同学会相当自信的将那一小段代码交给我们,剩下的就是考验面试官能否在更短的时间内看出这段代码的bug了. 二分查找是什么呢,这个不只程序员,其他很多非技术人员也会.比如我想一个1到100以内的数,你来猜,我告诉你每次猜的是大了还是小了,你会先猜50,然后

python函数:递归函数及二分查找算法

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层

顺序查找和二分查找

1.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组[转] 2.顺序查找 <?php//$n为待查找的数组元素的个数,$k为待查找的元素function seq_sch($array, $n, $k){ $array[$n] = $k; for($i=0; $i<$n; $i++){ if($array[$i]==$k){ return true;break; } } if ($i<$n) //判断是否到数组的末尾{ return $i

程序员,你应该知道的二分查找算法

原理 二分查找(Binary Search)算法,也叫折半查找算法.二分查找的思想非常简单,有点类似分治的思想.二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0. 为了方便理解,我们以数组1, 2, 4, 5, 6, 7, 9, 12, 15, 19, 23, 26, 29, 34, 39,在数组中查找26为例,制作了一张查找过程图,其中low标示左下标,high标示右下标,mid标示中间值下标 二分查

某科学的二分查找

最近学了一点二分查找,虽然算法难度不是很大,但是在noip中还是比较重要的. 接下来是我对查找算法的思考.(若有疏漏之处,敬请指出) 1.查找方式有两种: (1)线性查找:什么意思呢?就是暴力的用for循环去扫整个数组,枚举就完事儿了. (2)二分查找:利用中间节点mid进行标记,dio就完事儿了. 2.对于二分查找的一点引入: 猜数字的游戏全世界都玩过吧,给定一个范围,告诉大了还是小了,猜数字. 这是一个很简单也很经典的题目,也是二分的一个体现,这道题目的最佳策略很明显,折半思考就好了. 接下

Leetcode 二分查找 Search a 2D Matrix

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search a 2D Matrix Total Accepted: 10871 Total Submissions: 35629 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in e

二分查找的学习

来自:http://www.acmerblog.com/ubiquitous-binary-search-5345.html 我们都知道二分查找算法,实际上二分查找以及其扩展应用是很广泛的.这里收集了一些和二分查找有关的有趣问题.强烈建议大家看完问题后最小化浏览器,先尝试自己去解决,然后再看代码,问题都不是太难. 问题1描述 给一个已经排序的数组,其中有N个互不相同的元素.要求使用最小的比较次数找出其中的一个元素.(你认为二分查找在排序数组里找一个元素是最优的算法的吗?) 不需要太多的理论,这是

查找(一):二分查找和二叉查找树

二分查找 二分查找的原理很简单:在一个有序数组中(本文讨论的是升序,降序同理) 从数组中间的元素开始,如果A[mid]大于被查找元素key,那么就在A[0]到A[mid-1]中查找,反之在A[mid++]到A[A.lenth - 1]中查找. 从这看来,递归的意味又很浓啊,当然也可以用非递归的方式,效率更高,意味二分查找比较简单,就直接上代码了: 定义一个查找抽象基类: public abstract class SearchBase { public Integer[] a = {0 ,1 ,