二分查找

查找算法(I) 顺序查找 二分查找 索引查找

一曲冷凌霜 提交于 2019-11-27 23:29:32
查找   本文为查找算法的第一部分内容,包括了基本概念,顺序查找、二分查找和索引查找。关于散列表和B树查找的内容,待有空更新吧。 基本概念   查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录。   若没有找到满足条件的记录,则返回特定值,表明查找失败;若查找到满足条件的第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理;若需要查找到满足条件的所有记录,则可看做在多个区间内连续查找到满足条件的第一条记录的过程,即首先在整个区间内查找到满足条件的第一条记录,接着在剩余的区间内查找满足条件的第一条记录,以此类推,直到剩余区间为空为止。   作为查找对象的表的结构不同,其查找方法一般也不同。   查找过程是关键字比较的过程,比较次数的多少就是相应算法的时间复杂度,它是衡量一个查找算法优劣的重要指标。   对于一个查找算法的时间复杂度,还可以采用平均查找长度(Average Search Length, ASL),即在查找成功情况下的平均比较次数来表示。   平均查找长度的计算公式为:   ASL=∑p i ci   其中n为查找表的长度,即表中所含元素的个数,p i 为查找第i个元素的概率, c i 为查找第i个元素时所需的比较次数。   若查找每个元素的概率相同

查找算法:二分查找、顺序查找

一个人想着一个人 提交于 2019-11-27 23:29:15
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见: http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找。 查找算法通常需要两个输入: 1、被查找的序列 2、要查找的关键词 查找算法的输出参数和返回值: 1、返回类型为 Error_code 的值用以表示是否查找成功 2、如果查找成功,返回 success, 输出参数 position 定位到目标所在位置 3、如果查找失败,返回 not present,输出参数可能是未定义或不同于已有位置的任何值 顺序查找算法 顺序查找算法的思路很简单:从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。 【实验说明】 题目:编写一个程序,对顺序表{3,6,2,10,1,8,5,7,4,9},采用顺序查找关键字5的过程。要求输出: 1)原顺序表;2)查找到关键字的位置;3)进行比较的次数。 1.首先要编写类表List。需要满足最基本的操作插入insert(),获取retrieve(),以及得到大小size()。 2

二分查找

删除回忆录丶 提交于 2019-11-27 20:53:12
1 package cn.zhang.Array; 2 3 import java.util.Arrays; 4 5 /** 6 * 测试二分查找(折半检索) 7 * @author 张涛 8 * 9 */ 10 public class TestBinarySearch { 11 public static void main(String[] args){ 12 int[] a = {10,9,8,7,6,5,4,3,2,1}; 13 14 Arrays.sort(a);//先排序 15 System.out.println(Arrays.toString(a)); 16 17 System.out.println(myBinarySearch(a,1));//调用方法 18 19 } 20 21 public static int myBinarySearch(int[] arr,int value){ 22 23 int low = 0;//最小索引值 24 int high = arr.length - 1;//最大索引值 25 26 while(low<=high) { 27 int mid = (low + high) / 2; 28 29 if(arr[mid] == value) { 30 return mid; 31 } 32 else if(arr[mid]

poj2456 Aggressive cows 二分查找

本小妞迷上赌 提交于 2019-11-27 18:41:59
题目链接 题意:给定n个距离原点为i的栅栏,有多种方法选取k个栅栏将k头牛放入,每种方法中俩头牛的间距都有最小值,求出这些方法中此最小值的最大值 解法:二分查找 l为i最小值,r 为最大值,最大间隔为d=(l+r)/(k-1),得间隔区间(1,d) 对区间进行二分查找若当间隔最小值为mid时存在一种可实现方法其满足要求,若,l=r即整个区间已完成查找直接输出l或r即可,否则因需求最大值,继续到右区间寻找 否则到说明此mid较大,不满足要求,因到间隔最小值较小的左区间进行寻找 同时应避免二分查找出现死循环 #include<iostream> #include<algorithm> #include<cstdio> using namespace std; const int N=100005; int n,c,x[N]; int bfind(); bool judge(int d); int main(){ scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) scanf("%d",x+i); sort(x+1,x+n+1); printf("%d\n",bfind()); return 0; } int bfind(){ int l,r,mid; l=1; r=(x[n]-x[1])/(c-1); while(l<r){ mid=(l+r+1)/2

二分查找

血红的双手。 提交于 2019-11-27 16:57:27
/** * 二分查找 * @param num 搜索字符 * @param s1 搜索源 * @param start 开始位置 * @param end 结束位置 * @return true or false */ public static boolean find(int num, int[] s1,int start,int end) { if(start >end){ return false; } int rg = start+(end-start)/2; if(num<s1[rg]){ return find(78, s1,start,rg-1); } else if(num>s1[rg]){ return find(78, s1,rg+1,end); }else { return true; } } public static void main(String[] args) { int[] s1 = {1, 2, 35, 6, 78, 458, 246,5}; System.out.println(find(8, s1,0,8)); } 来源: https://www.cnblogs.com/lIllIll/p/11371021.html

面试现场:手撕二分查找算法

笑着哭i 提交于 2019-11-27 15:11:18
算法概述 二分搜索,也称折半搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 二分搜索在情况下的复杂度是对数时间,进行 O(log n)次比较操作(n在此处是数组的元素数量, O是大O记号, log 是对数)。 二分搜索使用常数空间,无论对任何大小的输入数据,算法使用的空间都是一样的。除非输入数据数量很少,否则二分搜索比线性搜索更快,但数组必须事先被排序。 示例代码 Java代码(循环) /** * 二分查找(循环) * @param arr 数组 * @param start 头索引 * @param end 尾索引 * @param target 目标 * @return 目标索引 */ public static int binarySearchByRecursion(int[] arr, int start, int end, int target){ int result = -1; while (start <= end){ int mid = start + (end - start

二分查找与hash查找

不想你离开。 提交于 2019-11-27 14:13:40
二分查找   有序列表对于我们的实现搜索是很有用的。在顺序查找中,当我们与第一个元素进行比较时,如果第一个元素不是我们要查找的,则最多还有 n-1 个元素需要进行比较。 二分查找则是从中间元素开始,而不是按顺序查找列表。 如果该元素是我们正在寻找的元素,我们就完成了查找。 如果它不是,我们可以使用列表的有序性质来消除剩余元素的一半。如果我们正在查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。如果该元素在列表中,肯定在大的那半部分。然后我们可以用大的半部分重复该过程,继续从中间元素开始,将其与我们正在寻找的内容进行比较。   1 """ 2 二分查找: 3 针对的是有序列表或者集合; 4 找到返回索引; 5 找不到返回-1. 6 """ 7 8 9 def binary_searc(sorted_list, item): 10 low = 0 11 high = len(sorted_list) 12 middle = (low + high) // 2 13 while low <= high: 14 if sorted_list[middle] < item: 15 low = middle + 1 16 elif sorted_list[middle] > item: 17 high = middle - 1 18 else: 19 return

c++实现二分查找法和求平方根

荒凉一梦 提交于 2019-11-27 13:08:33
二分法查找,指的是在 有序 的数组中查找指定的元素。 (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则返回结束,否则开始向两边查找。 (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。 二分法查找的时间复杂度O(logn)。 注:使用二分法之前必须先将数据进行排序。 1.循环二分法实现: int binarySearch(vector<int> &vi, int key) { int left = 0; int right = vi.size() - 1; int num = 0; while(left <= right) { num ++; int var = (left + right)/2; if(key == vi[var]) { cout << "查找次数:" << num << endl; return var; } else if(key < vi[var]) right = var - 1; else if(key > vi[var]) left = var + 1; } return -1; } 2.递归调用二分法: int RecursiveSearch(vector<int> &vi, int key, int left, int right) { if(left > right)

python 实现二分查找

天大地大妈咪最大 提交于 2019-11-27 12:13:17
原理 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 实现 来源: https://blog.csdn.net/Iris_6713/article/details/99672066

二分查找

夙愿已清 提交于 2019-11-27 11:13:24
二分查找 package demo3;public class BinarySearch { public String binarySearch(int[] array,int key) { int left = 0; int right = array.length-1; while (left<right) { int mid = left +(right-left)/2; if(array[mid]<key) { left=mid+1; } else if(array[mid]>key) { right=right-1; } else if(array[mid]==key) { return "yes"; } } return "no"; }} package demo3;public class TestBinarySearch { public static void main(String[] args) { int[] array = {2,1,1,2,3,5,6,7,21,12}; BinarySearch binary = new BinarySearch(); System.out.println( binary.binarySearch(array,4)); }} 来源: https://www.cnblogs.com/zhichun/p/11361265