二分查找

数据结构与算法之美---02 如何抓住重点,系统高效地学习?

我的梦境 提交于 2019-12-01 17:06:25
什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。 个人理解:(不知道正确与否) 数据结构是两部分,一个是数据,一个是结构,比如文档讲的图书馆藏书编号,数据是书籍,编号的规律就是结构,合起来就是数据结构。? 数据结构和算法什么关系? 数据结构和算法是相辅相成的。 数据结构是为算法服务的,算法要作用在特定的数据结构之上。 数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。 个人理解:(不知道正确与否) 不同的数据结构,使用的算法不同。同一数据的不同结构,可能使用的算法也不一样。 重点: 数据结构与算法中最重要的概念—— 复杂度分析 。 数据结构和算法解决的是如何更省、更快地存储和处理数据,考量效率和资源消耗的方法,就是复杂度分析法。 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 掌握数据结构与算法要点:“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景” 学习技巧: 1. 边学边练,适度刷题   建议你每周花 1~2 个小时的时间

二分查找

好久不见. 提交于 2019-12-01 12:17:56
# 二分查找 def binary_search(li, val): low=0 high=len(li) while low <= high: mid = (low+high) // 2 if li[mid] == val: return mid elif li[mid] < val: low = mid +1 else: high =mid - 1 return None l=[1,2,3,4,5,6,7,8,9] li = list(range(0,10000)) d = binary_search(l,4) print(d) # 递归版本的二分 def bin_search_rec(data_set, value, low, high): if low<=high: mid = (low + high) //2 if data_set[mid]== value: return mid elif data_set[mid] > value: return bin_search_rec(data_set, value, low,mid - 1) else: return bin_search_rec(data_set, value, mid +1,high) else: return 来源: https://www.cnblogs.com/chongdongxiaoyu/p

二分查找

烈酒焚心 提交于 2019-12-01 10:35:09
概念介绍   有同学想了解二分查找,今天它来了!二分查找也叫折半查找,查找效率较高。但是它有一个 使用前提:待查找的序列必须为有序的,升序或降序都可以 。我们来看一下它的核心思想:假设有n个元素的序列升序排列,以中间值arr[n/2]将序列分为两部分,我们取序列的中间值arr[n/2]与待查找数x比较,如果x<arr[n/2],就在序列的左半部分继续进行二分查找,如果x>arr[n/2],就在序列的左半部分继续进行二分查找,退出二分查找的条件为x=arr[n/2]。概念总是太抽象,咱们举例子来说明。   需求:在arr=[1,3,5,7,9,10,13,18]中,找到5。   第一轮查找:中间值为arr[(起始值下标:0+末位置下标:arr.length-1)/2]=arr[(0+8-1)/2]=arr[3],因为5<7,在第一轮中间值左半部分查找,也就是[ 1,3,5, 7 ,9,10,13,18](红色序列元素中查找)。   第二轮查找:找第二轮中间值arr[(起始值下标:0+第一轮中间值下标-1)/2]=arr[(0+3-1)/2]=3,3<5,在第二轮中间值右半部分查找,也就是[1,3, 5 ,7,9,10,13,18](红色序列元素中查找)。   第三轮查找:找第三轮中间值arr[(起始值下标:第二轮中间值下标+1+结束下标:第一轮中间值下标-1)/2]=arr[(2+3

二分查找基础

时间秒杀一切 提交于 2019-12-01 10:16:00
二分查找基础 那么今天我们就来讲一下二分查找吧。。。 二分查找。二分:二等份的意思。那么二分查找的含义也就是每次二等份查找,不断缩小查找范围。 举个例子,假如我们要玩一个猜数字游戏,给定范围,你要做的就是在这个区间随机猜一个数字,判官会告诉你高了或者是低了,知道判官告诉你回答正确。这其实就是二分查找的核心思想。 二分查找可以用在多种途径,也可以用在大型的项目当中,可以起到点睛之笔的效果。 下面我们模拟二分查找,我们要做的事情就是,在【1,n】区间寻找正确答案x, 现在你理解二分查找的核心含义了吗?那么,下面用代码体现出来: 1 int a[n]; 2 int left = 1,right = n; 3 int mid,mark = 0; 4 while(left<=right){ 5 mid = (left+right)/2; //这里容易出现bug 6 if(a[mid]>=x){ //精简写法, 为了防止陷入死循环 7 mark = mid; 8 right = mid-1; 9 } 10 else{ 11 left = mid+1; 12 } 13 if(mark){ 14 cout<<mark<<endl; 15 } 16 } 上面第5行容易出bug,为什么呢,,当n足够大的时候,left+right容易爆int(意思是,int值很可能溢出),那么整个程序就错了

第69题:x的平方根

若如初见. 提交于 2019-12-01 09:47:28
一. 问题描述 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。 二. 解题思路 本题主要采用二分查找来查找x的平方根m。这道题是比较简单的,但是要注意在进行二分查找时,对其初始值要有所限定,其最大值不能大于int类型的最大值2147483647。 步骤一:设置二分查找法的起点visit_first和终点visit_second。 步骤二:利用二分查找法进行查找(原理就不说了),其中最大值的限制条件要注意。 三. 执行结果 执行用时 :2 ms, 在所有 java 提交中击败了93.59%的用户 内存消耗 :33.7 MB, 在所有 java 提交中击败了75.11%的用户 四. Java代码 class Solution { public int mySqrt(int x) { int visit_first=0; int visit_second=((x)/2)+1; if(x>=Integer.MAX_VALUE||visit_second>Math.sqrt(2147483647)) { visit

二分查找

瘦欲@ 提交于 2019-12-01 04:54:34
1、题干:在数组中用二分查找元素 2、答题思路:通过对数组不断折半查找,与中间值比较大小后,选择相应的数组区间 3、关键代码: //本函数使用递归方法,调用find(数组,查询的值,起始下标,末尾下标)如find1(array,x,0,array.length-1),找到返回下标,否则返回-1,查找前必须先升序排序public static int find1(int a[],int x,int min,int max){ int k=(min+max)/2; if(a[k]<x&&k<max) return find1(a,x,k+1,max); else if(a[k]>x&&k>min) return find1(a,x,min,k-1); else if(a[k]==x) return k; return -1; } //普通方法的二分,while条件改写min<max则可以简化判断条件public static int find2(int a[],int x,int min,int max){ while(true){ int k=(min+max)/2; if(a[k]<x&&k<max){ min=k+1; } else if(a[k]>x&&k>min){ max=k-1; } else if(a[k]==x) return k; else return -1; }

二分查找的简单示例

让人想犯罪 __ 提交于 2019-12-01 01:48:10
一个整数键和一个 有序 整数数组,返回键值在数组中的索引 int rank(int key, int[] a) { int low = 0; int high = a.length - 1; while (low <= high) { int mid = low + (high - low) / 2; if (key < a[mid]) { high = mid - 1; } else if (key > a[mid]) { low = mid + 1; } else { return mid; } } return -1; } 来源: https://www.cnblogs.com/csysky/p/11646618.html

【Java】 二分查找算法(递归+循环)

北慕城南 提交于 2019-11-30 19:01:06
1. 二分查找算法——循环 public static int search(int[] arr,int k){ int start=0; int end=arr.length-1; while(start<=end){ int mid=(start+end)/2; if(arr[mid]==k) return mid; else if(arr[mid]>k) end=mid-1; else start=mid+1; } return -1; } 2. 二分查找算法——递归 public static int search2(int[] arr,int k,int start,int end){ if(start>end) return -1; int mid=(start+end)/2; if(arr[mid]==k) return mid; else if(arr[mid]>k){ return search2 (arr,k,start,mid-1); }else{ return search2(arr,k,mid+1,end); } } 测试: public static void main(String[] args) { int [] arr={2,4,5,9,10,24}; int k=9; System.out.println(search(arr,k));

查找

谁说我不能喝 提交于 2019-11-30 13:35:30
顺序查找   顺序查找是指将序列从头开始遍历,直到找到指定的元素为止。   在一个元素为n的序列中查找不存在的元素,需要比较n次。顺序查找虽然效率低下,但是却适用于任何序列。   顺序查找的代码如下: 1 public static int seqSearch(int[] arr, int val) { 2 for (int i = 0; i < arr.length; i++) { 3 if (arr[i] == val) return i; 4 } 5 return -1; 6 } seqSearch   例如,在序列(1, 2, 3, 4, 5, 6, 7, 8, 9)中查找元素7:从1开始比较,直到找到了7所在位标并返回。   顺序查找一共比较了7次。 二分查找   二分查找是指取有序序列中间的元素作为枢轴,枢轴两边被分割为两个子序列,一边比枢轴大,另一边比枢轴小。这样,查找的元素要么为枢轴,要么在其中一个子序列中。每次递归查找时,可以将区间规模大致缩减一半,从而大大加快查找效率。   在一个元素为n的序列中查找不存在的元素,需要比较log 2 n次。二分查找只适用于有序序列。   二分查找的代码如下: 1 public static int binarySearch(int[] arr, int low, int high, int val) { 2 if (low >

算法第二章上机实践报告

五迷三道 提交于 2019-11-30 06:26:29
一.实践题目 输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 输入格式: 输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。 输出格式: 输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 输入样例: 4 1 2 3 4 1 输出样例: 0 2 二.问题描述   由n个非降序排列的整数组成的数列,查找输入的x是否存在于数列中,存在则输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 三.算法描述 通过二分查找找到数列中间位置的数与x进行比较,如果x小于该数列中间位置的数,则该数列中间位置的数的左边所有数组成新的数列,若x大于该数列中间位置的数,则该数列中间位置的数的右边所有数组成新的数列,然后重复上面的操作,直到找到x或查找完数列。若x存在则x所在的下标(0~n-1)及比较次数,若x不存在,输出-1和比较次数。   代码: #include <iostream> using namespace std; int a[10005] = {}; static int num ,xiabiao; void binarySearch(int* a , int k , int left ,int right)