二分查找

二分查找

北城以北 提交于 2019-12-30 03:44:39
二分查找 二分查找 : 查找元素对应的索引 前提:数组元素有序 折半查找 : 图解 : 代码实现 案例 : public class Demo2_Array { public static void main(String[] args) { int [] arr = {11,22,33,44,55,66,77}; System. out .println(getIndex(arr, 22)); System. out .println(getIndex(arr, 66)); System. out .println(getIndex(arr, 88)); } public static int getIndex( int [] arr, int value ) { int min = 0; int max = arr.length - 1; int mid = (min + max) / 2; while (arr[mid] != value ) { //当中间值不等于要找的值,就开始循环查找 if (arr[mid] < value ) { //当中间值小于了要找的值 min = mid + 1; //最小的索引改变 } else if (arr[mid] > value ){ //当中间值大于了要找的值 max = mid - 1; //最大的索引改变 } mid =

java基础 二分查找算法

邮差的信 提交于 2019-12-30 03:44:30
/* * 折半查找法: * 思路: * 定义三个变量记录查找范围中最大、最小和中间的索引值,每次都是使用中间索引值与要查找的目标进行对比,如果不符合,那么就不停缩小查找范围 * */ //前提:查找的序列必须是有序的 int[] arr1 = {3,5,7,10,22,45,191}; //定义三个变量记录查找的边界和中间位置,并且初始化 int min = 0; int max = arr1.length; int mid = (min + max)/2; //定义一个变量,记录要查找的元素值; int target = 56; while(true){ if(target>arr1[mid]){ min = mid+1; }else if(target<arr1[mid]){ max = mid-1; }else if(target==arr1[mid]){ System.out.println("找到了" + target + "的位置是:" + mid); break; } mid = (max+min)/2; if(max<min){ System.out.println("没找到,查找的元素不存在"); break; } } 来源: https://www.cnblogs.com/michaellin/p/6219197.html

二分查找(折半查找)

穿精又带淫゛_ 提交于 2019-12-30 03:44:14
二分查找又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置 的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小, 则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。public class biSearch { public static int halfSearch(int[] arr, int number) { int min = 0; int max = arr.length; int mid = 0; while (min <= max) { mid = (min + max) / 2; if (number < arr[mid]) { max = mid - 1; } else if (number > arr[mid]) { min = mid + 1; } else { return mid; } } return -1; } public static void main(String[] args) { int[] arr = {2, 4, 6, 7, 9}; int x = halfSearch(arr, 7); System.out.println(x); }} 来源: https://www.cnblogs.com/rocdata/p/11445574.html

二分查找(下):如何快速定位IP对应的省份地址?

烂漫一生 提交于 2019-12-29 22:50:37
二分查找(下):如何快速定位IP对应的省份地址? 在百度,在搜索框中随机输一个IP地址,可以看到它的归属地,这是通过维护一个很大的IP地址库来实现的,在庞大的地址库中逐一对比IP地址所在的区间,非常耗时,假设我们有12W这样的IP区间与归属地的对应关系,如何快速定位出一个IP地址的归属地? 四个常见的二分查找变形问题 查找第一个值等于给定值的元素 查找最后一个值等于给定值的元素 查找第一个大于等于给定值的元素 查找最后一个小于等于给定值的元素 查找第一个值等于给定值的元素 有序数据集合中存在重复的数据,希望找到第一个值等于给定值的数据 有一个有序数组,a[5],a[6],a[7]=8,希望查找第一个等于8的数据,即下标为5的元素 public int bsearch(int[] a ,int n,int value){ int low = 0; int high = n -1 ; while(low <= high){ int mid = low + ((high - low)>>1); if(a[mid] >= value){ high = mid - 1; }else{ low = mid - 1; } } if(low < n && a[low]==value) return low; else return -1; } 该方式不好理解,换一种实现方法: public int

python 二分查找算法

陌路散爱 提交于 2019-12-29 04:19:06
Python实现二分查找(递归与非递归) 2018年08月01日 08:39:05 wo850781645 阅读数:2097 二分查找 每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大。 必须是有序序列才可以使用二分查找。 1.非递归算法 def binary_search(lis, nun): left = 0 right = len(lis) - 1 while left <= right: #循环条件 mid = (left + right) // 2 #获取中间位置,数字的索引(序列前提是有序的) if num < lis[mid]: #如果查询数字比中间数字小,那就去二分后的左边找, right = mid - 1 #来到左边后,需要将右变的边界换为mid-1 elif num > lis[mid]: #如果查询数字比中间数字大,那么去二分后的右边找 left = mid + 1 #来到右边后,需要将左边的边界换为mid+1 else: return mid #如果查询数字刚好为中间值,返回该值得索引 return -1 #如果循环结束,左边大于了右边,代表没有找到 lis = [11, 32, 51, 21, 42, 9, 5, 6, 7, 8] print(lis) lis.sort() print(lis) while 1: num = int

你真的会写二分查找吗

北战南征 提交于 2019-12-27 16:42:07
1 二分查找   二分查找是一个基础的算法,也是面试中常考的一个知识点。二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。 (图片来自《算法-第4版》) /** * 二分查找,找到该值在数组中的下标,否则为-1 */ static int binarySerach(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] == key) { return mid; } else if (array[mid] < key) { left = mid + 1; } else { right = mid - 1; } } return -1; }   每次移动left和right指针的时候,需要在mid的基础上+1或者-1, 防止出现死循环, 程序也就能够正确的运行。   注意:代码中的判断条件必须是while (left <= right),否则的话判断条件不完整,比如:array[3] = {1, 3, 5};待查找的键为5,此时在(low <

二分查找

怎甘沉沦 提交于 2019-12-26 10:23:40
二分查找 package com . ysx . common ; /** * @author youngbear * @email youngbear@aliyun.com * @date 2019/12/25 22:00 * @blog https://blog.csdn.net/next_second * @github https://github.com/YoungBear * @description */ public class BinarySearchUtils { /** * 二分查找 * @param nums 整型数组 * @param target 目标值 * @return 查找匹配的下标,如果没有匹配的则返回-1 */ public static int binarySearch ( int [ ] nums , int target ) { if ( nums == null || nums . length == 0 ) { return - 1 ; } int begin = 0 ; int end = nums . length - 1 ; int result = - 1 ; while ( begin <= end ) { // 这种写法是防止begin+end溢出 int middle = begin + ( end - begin )

BinarySearch 二分查找

回眸只為那壹抹淺笑 提交于 2019-12-26 02:06:19
# BinarySearch 二分查找法_Python实现 # 二分查找法是对有序数组的查找. def binary_search(li, num): left = 0 right = len(li) - 1 while left <= right: mid = (right + left)// 2 guess = li[mid] if num < guess: right = mid - 1 elif guess < num: left = mid + 1 else: return mid return None list = [1, 3, 35, 54, 55, 64, 65, 74, 165, 356, 645, 98984] index = binary_search(list, 165) print(index)    二分查找法是比较简单的查找方式. 对于有序数组来说, 一直询问该数值大于或者小于所需要 二分查找法, 唯一需要注意的是, 在比较了中间值mid之后. 所找值更大, 则查找范围左侧右移到mid下标+1 所找值更小, 则查找范围为右侧左移到mid下标-1 来源: https://www.cnblogs.com/jrri/p/12099952.html

数组结构

六月ゝ 毕业季﹏ 提交于 2019-12-25 10:57:14
程序设计 数组 通过这段时间的学习,我学习了顺序结构,循环结构,分支结构等等,我懂得了程序设计的一些基本的操作,但是有些时候这些程序的代码冗长繁琐,编程效率也差,为此,c++提供了数组类型,数组就是一组相同类型的变量,他们往往都是为了表示同一批对象的统一属性 定义一组数组的格式如下: 类型标识符 数组名[常量表达式]; 其中,类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义,一堆数组的元素引用,数组定义好后,就可以引用数组中的任意一个元素,引用格式为"数组名[下标]",另外,一堆数组的存储结构为:数组在计算机内存单元中是连续存储的。 第二课我们学习了一组数组的输入和输出,键盘读入,直接赋值,或者提供函数给数组整体进行赋值,如有memset函数和fill函数,memset函数是给数组按字节进行赋值,一般是用在char型数组中,如果是int类型的数组,一般赋值为0或者–1,使用前需要包含头文件#include<cstring>,而fill函数是给数组按元素进行赋值,可以是整个数组,也可以是部分连续函数,可以赋任何值,使用前需要使用头文件#include<algorithm>,另外,c++支持在定义数组同时,给别的元素赋值 如:int a[10]={0,1,2,3,4,5,6,7,8,9} 第三课我们学习了一组数组的插入删除,因为实际应用中

二分查找

房东的猫 提交于 2019-12-24 00:44:55
$nums = [1, 2, 3, 4, 5, 6]; $num=5; $start = 0; $end = count($nums)-1; echo binary_search($nums,$num,$start,$end); function binary_search($nums,$num,$start,$end){ $mid = floor(($start+$end)/2); $midNum = $nums[$mid]; if($num < $midNum){ $end = $mid-1; return binary_search($nums,$num,$start,$end); }elseif($num > $midNum){ $start = $mid+1; return binary_search($nums,$num,$start,$end); }elseif($midNum == $num){ return $mid; } }    来源: https://www.cnblogs.com/zh718594493/p/12089226.html