二分查找

81搜索旋转排序数组II

自作多情 提交于 2020-02-22 22:43:14
题目: 法一:自己的代码 不适用 思路:去重排序后,二分查找, 法二:别人的代码 思路:问题的关键是有时会出现左右相等的情况, 由于二分查找的主要思想是不断缩小搜索区间,所以把左侧缩小直到与右侧不相等为止, 来源: https://www.cnblogs.com/xxswkl/p/12347660.html

二分查找算法的递归与非递归实现(C++)

*爱你&永不变心* 提交于 2020-02-22 21:17:48
二分查找 又称 折半查找 , 首先, 假设表中元素是按升序排列, 将 表 中间位置 的关键字与查找关键字比较: 如果两者相等, 则查找成功; 否则利用中间位置将表分成前、 后两个子表: 如果中间位置的关键字大于查找关键字, 则进一步查找前一子表 否则进一步查找后一子表 重复以上过程, 直到找到满足条件的记录, 使查找成功, 或直到子表不存 在为止, 此时查找不成功。 二分查找算法的递归实现 //如果找到target,返回其所在数组下标,如果未找到,返回-1; int binary_search ( std :: vector < int > & sort_array , int begin , int end , int target ) { if ( begin > end ) { return - 1 ; } int mid = ( begin + end ) / 2 ; if ( target == sort_array [ mid ] ) { return mid ; } else if ( target < sort_array [ mid ] ) { return binary_search ( sort_array , begin , mid - 1 , target ) ; } else if ( target > sort_array [ mid ] ) {

PAT (Basic Level) Practice 1030 完美数列 (25分) (使用upper_bound进行二分查找!)

Deadly 提交于 2020-02-22 15:02:56
1.题目 给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。 输入格式: 输入第一行给出两个正整数 N 和 p,其中 N(≤10​5​​)是输入的正整数的个数,p(≤10​9​​)是给定的参数。第二行给出 N 个正整数,每个数不超过 10​9​​。 输出格式: 在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。 输入样例: 10 8 2 3 20 4 5 1 6 7 8 9 输出样例: 8 2.题目分析 使用uppper_bound函数进行二分查找 知识补充( https://blog.csdn.net/qq_40160605/article/details/80150252 ) 在 从小到大 的排序数组中 lower_bound( begin,end,num):从数组的begin位置到 end-1 位置二分查找 第一个大于或等于num的数字 ,找到返回该数字的地址,不存在则返回 end 。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。 upper_bound( begin,end,num):从数组的begin位置到 end-1 位置二分查找 第一个大于num的数字 ,找到返回该数字的地址,不存在则返回end

折半查找

China☆狼群 提交于 2020-02-21 07:08:53
折半查找 折半查找 (Binaryear)也称二分查找,它是一种效率较高的查找 但是折半查找要求线性表必须采用顺序储存结构,而且表中元素按关键字 有序排列 。 折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。 为了标记查找过程中每一次的查找区间,下面分别用 low 和 high 来表示当前查找区间的下界和上界,mid为区间的中间位置。折半查找每一次在找比较都使查找范围缩小一半,与顺序查找相比,很显然会提高查找效率。 代码如下: /* 折半查找的前提是存在已经排好序的序列 */ #include<iostream> using namespace std ; typedef int KeyType ; //key类型 typedef struct { KeyType key ; //关键字 KeyType other ; //其他信息 } ElemType ; //顺序表结构 typedef struct { ElemType* p ; int length ; } STable ; //顺序表结构 //创建顺序表 void CreateTable ( STable & T ) { cout

查找

久未见 提交于 2020-02-21 04:22:36
二分查找 二分查找的特殊情况1 若arr[mid] == 1, min = mid + 1; 若arr[mid] != 1, max = mid - 1; 二分查找的特殊情况2 三分查找 二分查找代码实现: # include <stdio.h> # define P(func, args...){\ printf("%s = %d\n", #func, func(args));\ } //1 3 5 7 9 10 int binary_search1 ( int * num , int n , int x ) { int head = 0 , tail = n - 1 , mid ; while ( head <= tail ) { mid = ( head + tail ) >> 1 ; if ( num [ mid ] == x ) return mid ; if ( num [ mid ] < x ) head = mid + 1 ; else tail = mid - 1 ; } return - 1 ; } //11111111110000000000 int binary_search2 ( int * num , int n ) { int head = - 1 , tail = n - 1 , mid ; while ( head < tail ) { mid =

查找算法

你离开我真会死。 提交于 2020-02-19 23:11:45
目录 折半查找 线性索引查找 折半查找 折半查找又称为二分查找,它的前提是记录的关键码有序,线性表必须采用顺序存储。折半查找的思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。 假设我们现在有这样-一个 有序表数组{0,1,16,24,35,47,59,62,73,88,99}16,除0下标外共10个数字。对它进行查找是否存在62这个数。我们来看折半查找的算法是如何工作的。 int Binary_Search(int *a, int n, int key) { int low, high, mid; low = 0; /*定义最低下标为记录首位*/ high = n; /*定义最高下标为记录末位*/ while (low <= high) { mid = (low + high) / 2; /*折半*/ if (key < a[mid]) /*若查找值比中值小*/ { high = mid - 1; /*最高下标调整到中位下标小一位*/ } else if (key > a[mid]) /*若查找值比中值大*/ { low - mid + 1; /

二分查找高效判定子序列

南笙酒味 提交于 2020-02-17 10:56:28
二分查找本身不难理解,难在巧妙地运用二分查找技巧。对于一个问题,你可能都很难想到它跟二分查找有关,比如前文 最长递增子序列 就借助一个纸牌游戏衍生出二分查找解法。 今天再讲一道巧用二分查找的算法问题:如何判定字符串 s 是否是字符串 t 的子序列(可以假定 s 长度比较小,且 t 的长度非常大)。举两个例子: s = "abc", t = " a h b gd c ", return true. s = "axc", t = "ahbgdc", return false. 题目很容易理解,而且看起来很简单,但很难想到这个问题跟二分查找有关吧? 一、问题分析 首先,一个很简单的解法是这样的: bool isSubsequence(string s, string t) { int i = 0, j = 0; while (i < s.size() && j < t.size()) { if (s[i] == t[j]) i++; j++; } return i == s.size(); } 其思路也非常简单,利用双指针 i, j 分别指向 s, t ,一边前进一边匹配子序列: 读者也许会问,这不就是最优解法了吗,时间复杂度只需 O(N),N 为 t 的长度。 是的,如果仅仅是这个问题,这个解法就够好了, 不过这个问题还有 follow up : 如果给你一系列字符串 s1,s2,..

基于STL的二分查找——lower_bound函数

☆樱花仙子☆ 提交于 2020-02-17 06:25:41
概述 C++ STL提供了标准二分查找相关实现。如下图所示,来自 http://www.cplusplus.com/reference/algorithm/ 。 对应的函数功能如下表 函数名 函数作用 binary_search 在指定的范围内,使用二分查找某个值 lower_bound 在指定的范围内,使用二分查找某个值的左下界 upper_bound 在指定的范围内,使用二分查找某个值的右上界 equal_range 在指定的范围内,使用二分查找某个值位置范围,即左下界到右上界 lower_bound函数 函数作用 Return iterator to lower bound Returns an iterator pointing to the first element in the range [first,last) which does not compare less than val. 使用前提 1、包含对应的 STL 头文件。即 #include <algorithm> 2、需要包括命名空间 std。即 using namespace std; 或者使用显式调用命名空间。即 std::lower_bound(...); 3、查找的数列必须 有序 。 函数原型 来自 http://www.cplusplus.com/reference/algorithm

java 13-1 数组高级二分查找

喜欢而已 提交于 2020-02-16 07:51:08
  查找:     1、基本查找:数组元素无序(从头找到尾)     2、二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小。以下的分析是从小到大的数组   二分查找分析:     A:先对数组进行对半(也就是设置 min索引为0,max索引为arr.length-1,然后对半的 索引mid为(min+max)/2)     B:把所需要查找的数据x跟arr[mid]进行对比        a:两者的值相等,就返回mid索引        b:两者不等:           1、如果 x > arr[mid],则 min索引的值改变为:min = mid+1,然后 mid 要重新赋值 :(min+max)/2           2、如果 x < arr[mid],则 max索引的值改变为:max = mid-1,然后 mid 要重新赋值 :(min+max)/2     C:重复B的动作     D:注意:为了避免查找一个不存在的数据时,会出现死循环,所以要在B中加入一个限制条件:        if(min > max){           return -1;           }     E:以上定义为方法:        a:返回类型:int(因为要的是所查找数据的索引)        b:参数列表:int[] arr(所查找的数组

算法图解---二分查找

喜你入骨 提交于 2020-02-12 14:21:04
二分查找(binary-search)是一种算法,输入是一个有序的元素列表(仅当列表是有序的时候,二分查找才管用)。若查找的元素包含在列表中,二分查找返回其位置,否则返回null。 1.查找的范围 low = 0 high = len(list) -1 2.检查中间的元素 mid = (low + high)/2 # 如果(low + high)是奇数,python自动将mid向下圆整 guess =list[mid] #猜的数字小了,修改low if guess < item: low = mid +1 #猜的数字大了,修改high if guess > item: high = mid -1 3. 完整代码如下: def binary_search(list,item): low = 0 high = len(list)-1 while low <= high: mid = int((low + high)/2) guess = list[mid] if guess == item: return mid elif guess > item: high = mid -1 else: low = mid +1 return None my_list= [1,3,5,7,9] print(binary_search(my_list,3)) print(binary_search