二分查找

二分查找

孤人 提交于 2020-03-07 03:54:46
https://vjudge.net/contest/295090#problem/B 题意:给出一个序列,在该序列找一个数m,问该在该序列第几小。 解法一:直接统计比m小的数,O(n) 解法二:排序,再二分注意要mid-1,因为如果在该序列中找不到该数时会死循环,O(nlogn) 解法三:通过一次遍历交换将比a[Mid]小的数放到a[Mid]左边,比a[Mid]大的数放到a[Mid]右边。注意并没有完全排序(这里使用了快速排序的思想)O(2*n)。 #include<bits/stdc++.h> typedef long long ll ; #define int ll #define mod 1000000007 #define gcd __gcd #define rep(i , j , n) for(int i = j ; i <= n ; i++) #define red(i , n , j) for(int i = n ; i >= j ; i--) #define ME(x , y) memset(x , y , sizeof(x)) //ll lcm(ll a , ll b){return a*b/gcd(a,b);} //ll quickpow(ll a , ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;b>>=1,a=a

python使用二分查找法查找某个数是否在列表内

≡放荡痞女 提交于 2020-03-07 02:23:28
输入一个数,使用二分查找法查找它是否在列表[34,64,67,72,73,82,83,85,87,88,90,91,96,98]中。如果找到,输出此数及其索引值,否则输出”没有找到“的信息。 如果lis[mid]<key,则min=mid+1 如果lis[mid]>key,则max=mid-1 如果lis[mid]==key,输出索引值 代码: lis = [ 34 , 64 , 67 , 72 , 73 , 82 , 83 , 85 , 87 , 88 , 90 , 91 , 96 , 98 ] key = int ( input ( ) ) min = 0 max = len ( lis ) if key in lis : while min < max : mid = ( min + max ) // 2 if lis [ mid ] < key : min = mid + 1 elif mid > key : max = mid - 1 elif lis [ mid ] == key : print ( mid + 1 ) break else : print ( "没有找到" ) 运行结果: 来源: CSDN 作者: 熊冰洋啊 链接: https://blog.csdn.net/qq_43589852/article/details/104703030

查找算法之二分查找

本秂侑毒 提交于 2020-03-06 09:01:57
查找算法 线性查找算法 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。 思路:如果查找到全部符合条件的值。[思路分析.] 全部代码 package com.atguigu.search; public class SeqSearch { public static void main(String[] args) { int arr[] = { 1, 9, 11, -1, 34, 89 };// 没有顺序的数组 int index = seqSearch(arr, -11); if(index == -1) { System.out.println("没有找到到"); } else { System.out.println("找到,下标为=" + index); } } /** * 这里我们实现的线性查找是找到一个满足条件的值,就返回 * @param arr * @param value * @return */ public static int seqSearch(int[] arr, int value) { // 线性查找是逐一比对,发现有相同值,就返回下标 for (int i = 0; i < arr.length; i++) { if(arr[i] ==

二分查找

白昼怎懂夜的黑 提交于 2020-03-05 21:28:55
问题 给定一个整数X和整数A0,A1,A2.....AN-1,后者已经预先排序完成,求使得X=Ai的下标i,若X不在数据中则返回-1; 问题分析: 最简单的方法为从头到尾对整数组进行遍历操作,但是这种做实际上没有用到数组已经排序完成这一条件,因此效率较低。 对于这类查找可以采用二分查找的方式。 算法分析: 直接验证X与居中元素的大小关系,如果大于就继续验证X与右侧元素组的居中元素的大小关系,如果小于就验证X与左侧元素组的居中元素大小关系,以此类推直到找到下标或得到X不在数组中的结论。 代码: int BinarySearch(ElementType A[],ElementType X,int N) { int Low,High,Mid; Low=0;High=N-1; while(High>=Low) { Mid = (High+Low)/2; if(A[Mid]<X) { Low = Mid+1; } else if(A[Mid]>X) { High = Mid-1; } else return Mid; } return NotFound; } 来源: https://www.cnblogs.com/cyh-blackhouse/p/12422613.html

算法图解(读书笔记)

*爱你&永不变心* 提交于 2020-03-05 15:15:17
第一章 二分查找 输入:一个 有序 的元素列表 过程:要查找的元素包含在列表中,二分查找返回其位置,否则返回NULL 对于包含n个元素的列表,用二分查找最多需要 l o g 2 n log_{2}n l o g 2 ​ n 步,简单查找最多需要 n n n 步 算法实现: def binary_search ( list , item ) : low = 0 high = len ( list ) - 1 while low <= high : mid = ( low + high ) / 2 #向下取整 guess = list [ mid ] if guess = item : reutrn mid if guess > item : high = mid - 1 else : low = mid + 1 return None #None 表示空,意味着没有找到指定元素 运行时间为对数时间(O( l o g n log n l o g n )) 最多需要猜测的次数与列表长度相同,这被称为 线性时间 (linear time) O(1)代表常量时间 大O表示法 大O表示法指出了算法运行时间的增速,指出了最糟情况下的运行时间 常见的大O运行时间 O ( l o g n ) O(log n) O ( l o g n ) :对数时间,比线性时间快,例如二分查找 O ( n ) O(n

大O表示法

你。 提交于 2020-03-04 18:48:57
大O表示法???这是什么东西?? 大O表示法 其实并没有多么高大上, 而是一种特殊的表示法,指出了算法的速度有多快 。这种表示法简单易懂,非常明了,所以应用广泛。 举个例子,就如我上一篇博客中提到的 二分查找(https://blog.csdn.net/qq_45835827/article/details/104651718) 。如果用大O表示法来分别表示简单查找和二分查找的速度为: 简单查找 :O(n) 二分查找 :O(log 2 n) 这就是 大O表示法 ,前面的O有点大。 因为在很多时候,如果只是告诉你算法花了多长时间是没有用的,而是需要知道运行时间如何随list的增长而增长。大O表示法的用武之地就在于此。也就是之前所说的,大O表示法指出了算法的速度有多快。 下面给大家介绍一些常见的大O运行时间 O(log 2 n),对数时间,例如:二分查找。 O(log n),线性时间,例如:简单查找。 O(n * log 2 n),例如:快速排序(可以参考我的另外一篇博客)。 O(log n 2 )例如:选择排序(可以参考我的另外一篇博客)。 O(log n!)例如:用于旅行商问题。 大家可能也注意到了一点, 大O表示法指出了最糟情况下的运行时间 。怎么去理解这个性质呢?其实就是说该算法最糟运行的时间大O表示法所指代的时间,这是一个保证。比如说,小明心里想的数字为50

查找算法入门

て烟熏妆下的殇ゞ 提交于 2020-03-03 07:16:13
1.查找算法简介 通常所说的有七种比较常用的查找算法:顺序查找,二分查找,插值查找,斐波那契查找,树表查找,分块查找,哈希查找。顺序查找即是按照数据的存储结构,从前往后一次进行查找,这种方式较为低效。如果数据是按照某种顺序存储在内存中,可以按照二分查找的方式,提高查询的效率。插值查找和斐波那契查找属于对二分查找的优化。树表查找是基于树形存储结构的查找方式,常见的树形存储结构主要有二叉树,平衡二叉树和红黑树。分块查找是二分查找和顺序查找的一种改进的方法,由于只要求索引表是有序的,对块内节点并没有排序的要求,因此特别适合于节点动态变化的情况,说的通俗一点,就是将待查找的数组进行分组,确定每个分组内元素的取值范围,然后将待查找的元素在其对应的范围内进行顺序查找。哈希查找也叫散列查找,整个散列查找过程分为两步:1.在存储时,通过散列函数计算记录的散列地址,并按照此散列地址存储该记录。2.当查找的时候,一样通过散列函数计算记录的散列地址,然后访问散列地址的记录。 2.顺序查找与二分查找 本文主要是简单对顺序查找和二分查找这两个基本的查找方式进行简单的介绍,后面会重点对哈希查找和树表查找进行介绍,欢迎大家一起交流讨论,共同进步。 2.1 顺序查找 顺序查找就是按照存储顺序从前往后进行查找,没什么好说的,直接上代码。 public class shunxu { public static

二分查找--循环数组找最小值

人走茶凉 提交于 2020-03-02 20:41:03
#include<iostream> using namespace std; int main() { int arr[] = {5,6,7,8,9,1,2,3,4}; int left = 0, right = 8; cout<<"循环有序数组arr[]={"; for(int i = 0; i < 9; i++) if(i != 8) cout<<arr[i]<<","; else cout<<arr[i]<<"}"<<endl; while(left <= right) { int mid = left + (right - left) >> 1; if(arr[left] < arr[right]) { cout<<"最小值为:"<<arr[left]<<endl; return 0; } else { if(arr[left] > arr[mid]) { right = mid - 1; } else if(arr[mid] > right) { left = mid + 1; } else { int minn = arr[left]; for(int i = left + 1; i < right ; i++) if(arr[i] < minn) { minn = arr[i]; } cout<<"最小值为:"<<minn<<endl; return 0; } 来源

二分查找的特性及应用

假如想象 提交于 2020-03-02 11:31:42
二分查找的特性及应用 题目描述 题目分析 C++代码 二分法示例补充   如果我们熟悉二分查找,我们就知道 二分查找有一个重要的基础,就是需要有序的顺序表。 这里有两点,一个是有序,另一个是顺序表。一般来说,只要是查找的题目,和这两者挂上钩,基本就是二分查找无疑了。因为二分查找过于重要,建议大家自己要能写出代码。 题目描述   统计一个数字在一个排序数组中出现的次数。 题目分析   如果说从前往后扫描一个数组,统计这个数字在数组中出现的次数,显然复杂度是 O ( n ) O(n) O ( n ) 的,完全用不到排序数组这个特点。我们要想用上这个特点,在一个排序数组中一个数字出现多次的话,显然这写数字是挤在一处的,我们只需要找到第一次出现的位置,然后找到最后一次出现的位置,显然就可以轻松得到这个数字出现的次数。那就是在有序数组中找第一次出现的位置和最后一次出现的位置。不用说了,必然二分查找。   但是我们知道 普通的二分查找是找一个数字出现的位置,如果这个数字出现多次,二分查找只能返回其中一个的位置。 而这个时候,我们就需要对代码进行修改,修改为可以保证只查找到该数的第一个数字或者最后一个数字。这个时候就完成了任务。但是这样可能就要写两个函数,一个找第一次出现的位置,一个找最后一次出现的位置。   我们可以对这个问题稍微做一做变通,我们在学习有序表的插入时候

查找算法学习

巧了我就是萌 提交于 2020-03-01 21:42:39
####查找算法学习 #####顺序查找 最简单的查找方法,从线性表的一端开始,依次将每个记录的关键字进行比较,若相同则返回该关键字所在数组的位置 int SeqSearch(int A[],int n,int key){ int i ; for(i = 0;i<n;i++){ if(A[i] == key){ return i; //返回当前位置 } } return -1; } int main(int argc, const char * argv[]) { int A[10] = {1,2,3,4,5,6,7,8,9,0}; int data = SeqSearch(A,10, 0); printf("%d",data); return 0; } #####折半查找(二分查找) 折半查找要求查找表的数据是线性结构保存,并且还要求查找表的数据是按照关键字由小到大有序排列 int BinarySearch(int A[],int n,int key){ int low,high,mid; low = 0;high = n-1; while(low<=high){ mid = (low+high)/2; if(A[mid]==key){ //如果中间的值恰好等于关键字的值,则返回 return mid; }else if(A[mid]>key) //如果中间值大于关键字 high