二分查找

PTA6-10 二分查找 (20分)

ぃ、小莉子 提交于 2019-12-22 17:14:43
PTA6-10 二分查找 (20分) 本题要求实现二分查找算法。 函数接口定义: Position BinarySearch ( List L , ElementType X ) ; 其中 list 结构定义如下: typedef int Position ; typedef struct LNode * List ; struct LNode { ElementType Data [ MAXSIZE ] ; Position Last ; /* 保存线性表中最后一个元素的位置 */ } ; L 是用户传入的一个线性表,其中 ElementType 元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记 NotFound 。 裁判测试程序样例: # include <stdio.h> # include <stdlib.h> # define MAXSIZE 10 # define NotFound 0 typedef int ElementType ; typedef int Position ; typedef struct LNode * List ; struct LNode { ElementType

找工作专题---二分查找

做~自己de王妃 提交于 2019-12-22 01:58:33
二分查找 简介 二分查找作为高效的查找算法,可以说是每个学计算机的都应该懂的,在每年的面试中,可以说是必须考察的点; 其实我们小时候就用过这个算法,只是没注意罢了,比如一本书300页,你要找第100页,你翻到了第20页,那么你肯定向后翻,你又翻到了第80页,你肯定继续向后找,每次砍掉一些。还比如英语字典,是按照单词的字典序排列的,你也是利用上面的算法在找。其实这就是二分查找。 适用范围 有序的线性表(一定得是数组存储的,由于需要快速取得对应位置的值) 需要注意的问题 int binarySearch(int arr[], int beg, int end, int target) 1、安全性检测 beg 与 end 必须>=0 beg <= end end <= 数组的大小 对应的检测语句如下: assert(beg >= 0 && beg <= end && end < sizeof(arr)/sizeof(int)); /*sizeof这个语法貌似不一定对*/ 2、特殊判断 如何出入的是一个空数组,此时beg==end==0,计算mid会得0,然后访问arr[0]会报错所以应该加一句: if (beg == end && beg == 0) return -1; 3、注意mid的求法: /*method1:*/ int mid = (beg + end) / 2; /

用二分查找法实现数组的查找

半世苍凉 提交于 2019-12-21 09:19:02
public class BinarySearch { public static void main(String[] args) { int a[] = { 1, 3, 6, 8, 9, 10, 12, 18, 20, 34 }; int i = 12; System.out.println("您所要查找数 "+i+" 的位置是: "+binarySearch(a,i)); } //二分查找 public static int binarySearch(int a[],int m) { if(a.length == 0) return -1; int begin = 0; //起始位置 int end = a.length - 1; //末尾位置 int mid = (begin + end) / 2; //要查找的中间位置 while(begin <= end) { if(a[mid] == m) { //返回找到的位置 return mid; }else if(a[mid] > m) { //如果中间位置的值比所要找的值大,那么末尾位置指向中间位置的上一个位置 end = mid - 1; }else{ //如果中间位置的值比所要找的值小,那么起始位置指向中间位置的下一个位置 begin = mid + 1; } mid = (begin + end) / 2; }

二分查找

送分小仙女□ 提交于 2019-12-19 07:46:33
二分查找也叫折半查找,是一种基本的查找算法,这种查找方法需要待查的表满足两个条件 首先,查找表必须使用顺序的存储结构 其次,查找表必须按关键字大小有序排列 算法的基本思想是: 将查找表中间位置数据元素的关键字与给定关键字比较,如果相等则查找成功; 否则利用中间元素将表一分为二,如果中间关键字大于给定关键字,则在前一子表中进行折半查找,否则在后一子表中进行折半查找。重复以上过程直到找到满足条件的元素,则查找成功; 或直到子表为空为止,此时查找不成功。 二分查找的非递归写法: 1 public int firstOccurrence(int [] nums,int target){ 2 int low = 0,high = nums.length - 1; 3 while(low <= high){ 4 int mid = low + (high-low)/2; 5 if(nums[mid] == target){ 6 return mid; 7 } 8 if(nums[mid] < target){ 9 low = mid+1; 10 }else { 11 high = mid-1; 12 } 13 } 14 return -1; 15 } 来源: https://www.cnblogs.com/stevewys/p/11077302.html

经典算法二分查找循环实现Java版

∥☆過路亽.° 提交于 2019-12-19 04:22:18
二分查找 定义 二分查找(Binary Search)又称折半查找,它是一种效率较高的查找方法。 要求 (1)必须采用顺序存储结构 (2)必须按关键字大小有序排列 查找思路 首先将给定值K,与表中中间位置元素的关键字比较,若相等,返回该元素的存储位置;若不等,这所需查找的元素只能在中间数据以外的前半部分或后半部分中。然后在缩小的范围中继续进行同样的查找。如此反复直到找到为止。 适用情况 该查找方法仅适合于线性表的顺序存储结构,不适合链式存储结构,且要求元素按关键字有序排列。 优缺点 虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。 非递归实现代(还有一种用递归实现的二分查找) Java代码如下(自己写的,有兴趣的可以查看Java源码): import java.util.Arrays; public class BinarySearch { public static void main(String[] args) { // 测试代码 int[] arr = { 4, 58, 69, 54, 2, 48, 62, 78 }; //

知识点八:二分查找(上)

ⅰ亾dé卋堺 提交于 2019-12-18 02:27:57
前言 二分查找(Binary Search)算法,也叫折半查找算法,是一种非常简单的查找算法,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。 老规矩,我们还是来看一道思考题:假设我们有 1000 万个整数数据,每个数据占 8 个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这 1000 万数据中? 我们希望这个功能不要占用太多的内存空间,最多不要超过 100MB,你会怎么做呢? 二分思想 二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一个猜字游戏。我随机写一个 0 到 99 之间的数字,然后你来猜我写的是什么。猜的过程中,你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为止。那么如何快速猜中我写的数字呢? 假设我写的数字是 23,你可以按照下面的步骤来试一试(如果猜测范围的数字有偶数个,中间数有两个,就选择较小的那个)。 可以看出,只需要7 次就猜出来了,是不是很快?这个例子用的就是 二分思想 ,按照这个思想,即便我让你猜的是 0 到 999 的数字,最多也只要 10 次就能猜中。不信的话,你可以试一试。 回到实际的开发场景中。假设有 1000 条订单数据,已经按照订单金额从小到大排序,每个订单金额都不同,并且最小单位是元。我们现在想知道是否存在金额等于 19 元的订单。如果存在

查找算法之二分查找

不想你离开。 提交于 2019-12-18 02:18:07
算法原理: 二分查找的前提是有序序列 将序列中位置纪录与关键字比较,若相等,则查找成功 否则用中间位置纪录将表分成前后两个子表 如果关键字大于查找关键字,则进一步找前一子表 否则进一步查找后一子表 重复以上过程,知道找到满足条件的纪录,使得朝朝成功,或知道子表不存在,此时查找不成功‘ 代码: def bin_search ( dat_sret , val ) : low = 0 high = len ( dat_sret ) - 1 while low <= high : mid = ( low + high ) // 2 # 整除 if dat_sret [ mid ] == val : return mid elif dat_sret [ mid ] < val : low = mid + 1 else : high = mid - 1 else : return 代码解释: 代码中 (low + high) // 2 表示 python 的地板除法 也就是整除。 来源: CSDN 作者: sha_ka 链接: https://blog.csdn.net/sha_ka/article/details/103578567

二分查找

跟風遠走 提交于 2019-12-16 03:36:13
二分查找过程:通过将有序的数组(注意是有序)折半,首先将目标元素与数组中间的数字做比较,如果目标元素值小于中间元素,则将数组前半部分进行折半查找,将前半部分的mid元素与目标元素做比较,如果目标元素小于mid元素,同理将数组再折半在前半部分(此时是数组的1/4部分)二分查找,以此类推;反之,若目标元素值大于数组中间元素,则向后半部分查找。(见下面动图1) 线性查找(见动图2) 二分查找(折半搜索)目的:查找有序结构中某一特定元素 (图转载自: https://www.cnblogs.com/tflsnoi/p/8071970.html ) 时间复杂度:log(n),n是元素的个数 空间复杂度:o(1) 缺点: 前提条件必须是有序结构。 优点: 每次都是折半查询,查询次数少,效率高,性能较好 适用场景:不经常变动,查询频繁且有序的结构。 来源: CSDN 作者: AMEI_2015 链接: https://blog.csdn.net/condoleeA/article/details/103531039

1算法简介

只谈情不闲聊 提交于 2019-12-15 11:00:47
1.1 引言 算法是一组完成任务的指令。任何代码片段都可以视为算法 1.2 二分查找 场景:假设1-100的数字,查找75 简单查找:从1开始依次往上猜,需要才到75次才能才到 二分查找:50-75,2次就可以 使用二分查找时,没有都排除一半的数字。对于包含n个元素的列表,使用二分查找最多需要log 2 N步,而简单查找最多需要n步 来源: https://www.cnblogs.com/csj2018/p/12042169.html

二分查找

落爺英雄遲暮 提交于 2019-12-15 06:41:53
二分查找: 使用场景:有序数据 存放于数组中 数据量过大也不适宜使用,因为数组占用的是连续大小的空间 作业: 有序数组中(不)存在重复元素 递归和非递归实现 思考题: 如何在 1000 万个整数中快速查找某个整数? 是否有序? 有序二分查找 无序:查找几次? 多次,先排序,后遍历查找?? 一次,直接遍历 查找第一个大于等于给定值的元素 ip范围查找,二分查找,找大于等于该数的值,然后查看对应地址 练习: 查找第一个大于等于给定值的元素 非递归,精简写法 while 查找第一个小于等于给定值的元素 public class Search { public static void main(String[] args) { // int low =1,high=5; // int mid = low + ((high - low) >> 1);// 避免low+high导致的溢出问题 // System.out.println(mid); // System.out.println((low+high)/2); // // // int[] arr = {1,1,2,2,3,4,4,6,6,7}; // System.out.println(binarySearch(arr,1,0,arr.length-1)); new LinkedHashMap<>(); int[] arr =