-
对长度为200的有序表进行二分查找_五分钟学算法之经典算法题:二分查找(某东校园招聘笔试真题)...
2021-01-27 15:35:40今天分享一道简单的笔试题,题目来源于京东校园招聘笔试真题。你做出这道简单的题目需要花费多少东呢?题目描述有一个有序表...有序表的长度为 13,根据 二分查找法 查找数的特性,每次都 n/2 进行折半查找。13 / 2...今天分享一道简单的笔试题,题目来源于京东校园招聘笔试真题。你做出这道简单的题目需要花费多少东呢?
题目描述
有一个有序表为 {1,5,8,11,19,22,31,35,40,45,48,49,50} ,当二分查找值为 48 的结点时,查找成功需要比较的次数( )
- A、4
- B、3
- C、2
- D、1
题目分析
一道送分题。
有序表的长度为 13,根据 二分查找法 查找数的特性,每次都 n/2 进行折半查找。
13 / 2 = 6 6 / 2 = 3 3 / 2 = 1 1 / 2 = 0
最多需要 4 次就能得出结果。
列表下标索引从零开始标记。
这道题目需要查找的是 48 。
第一次,求出 [0,12] 中间节点。
0 + (12 - 0) / 2 = 6 a[6] = 31 < 48
区间变为 [7,12]。
第二次,求出 [7,12] 中间节点。
7 + (12 - 7) / 2 = 9 a[9] = 45 < 48
区间变为 [10,12]。
第三次,求出 [10,12] 中间节点。
10 + (12 - 10) / 2 = 11 a[11] = 49 > 48
区间变为 [10,11]。
第四次,求出 [10,11] 中间节点。
10 + (11 - 10) / 2 = 10 a[10] = 48 = 48
找到啦!
我的个人博客大改版,200 篇原创算法等你来看!
五分钟学算法-和程序员小吴一起学算法www.cxyxiaowu.com -
顺序表查找、有序表查找、索引顺序表查找
2017-11-14 14:46:35顺序表查找有序表查找 对顺序表进行二分查找 索引顺序查找表 索引顺序查找表也就是分块查找 把线性表分为若干块,每一块的关键字都小于下一块的最小关键字。 索引按顺序排列进行二分查找,在对找到的块进行顺序查找顺序表查找
有序表查找
- 对顺序表进行二分查找
索引顺序查找表
- 索引顺序查找表也就是分块查找
- 把线性表分为若干块,每一块的关键字都小于下一块的最小关键字。
- 索引按顺序排列进行二分查找,在对找到的块进行顺序查找
-
对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...
2021-01-27 15:35:40顺序查找基本思想属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素。这是最基本的查找方法,也是时间复杂度最高的查找算法。在数据过多时,这种方法并...分块查找的速度虽然不如二分查...顺序查找
基本思想
属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素。
这是最基本的查找方法,也是时间复杂度最高的查找算法。
在数据过多时,这种方法并不适用。
代码实现
分块查找
基本思想
属于顺序查找的改进方法,又叫索引顺序查找。
将n个元素分成m块(m<=n),每个块中元素可以没有顺序,但是m个块之间是有序排列,所以特别适合于节点动态变化的情况。
分块查找的速度虽然不如二分查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。
那么索引表的构成就是每个块中的最大元素。
查找方式是先对索引表进行二分或顺序查找,选出目标值应该所在的块,然后在块内进行顺序查找。
二分查找
基本思想
属于有序查找算法,也叫折半查找,就是将数组每次选取一半进行查找,怎么选取一半就需要让中间值与目标值value进行比较,因为有序,所以中间值小于目标值则选取后半部分,大于目标值则选取前半部分,依此类推,直到找出与目标值相等的元素,否则返回-1或null。
这种方法有效的缩减查找次数和查找范围,适用于数据量比较大的有序表。
因为前提是有序表,所以对于插入删除等操作过多的数据集并不适用,因为在排序算法上浪费的时间会比较多。
一般的时间复杂度是O(log2n)
代码实现
插值查找
基本思想
属于二分查找的改进版,二分查找一直重复一半一半的操作,这种操作比较固定,并不会根据目标值的大小进行自适应分段和选择,而插值查找可以根据目标值value进行自适应。
下面是百度词条对插值的解释:插值类似于平常查英文字典的方法,在查一个以字母C开头的英文单词时,决不会用二分查找,从字典的中间一页开始,因为知道它的大概位置是在字典的较前面的部分,因此可以从前面的某处查起。
既然是二分查找的改进版,那么就要找关键点进行改进,二分是取1/2的有序表进行查找,那么mid就是关键点,二分中mid=(low+high)/2,可以转化成mid=low+(high-low)/2,所以相当于(high-low)/2中的1/2就是所分的比例,那么可以对mid进行改进,mid=low+low+(value-list[low])/(list[high]-list[low])*(high-low),(value-list[low])/(list[high]-list[low])就是所分的比例。
根据目标值在整个有序表中所处的位置,让mid的变化更靠近目标值value,这样也就间接地减少了比较次数。
这种方法适用于关键字分布均匀的有序表。
复杂度为O(log2(log2n))
代码实现
斐波那契查找
基本思想
斐波那契数列与0.618有着奇妙的关联,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,所以可以将黄金比例运用到查找中。
百度词条:斐波那契搜索,斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F(n),将原查找表扩展为长度为F(n)(如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。
这个方法比较重要,所以百度词条上讲的很清楚!
代码实现
总结
- 还剩下两种非常重要的查找算法,就是树表和哈希,这两种我就单独写,ball ball大佬们不要嫌弃!
-
有序表查找
2019-06-10 09:30:091.二分查找 ...假设有一个有序表数组{0,1,16,24,35,47,59,62,73,88,99},共10个数字,对其进行查找是否存在62这个数。 /* 二分查找 */ int Binary_Search(int *a, int n, int Key) { int low,...1.二分查找
二分查找又叫折半查找,它的前提是线性表中的记录必须是关键码有序(通常从小到大有序,线性表必须采用顺序存储)。
假设有一个有序表数组{0,1,16,24,35,47,59,62,73,88,99},共10个数字,对其进行查找是否存在62这个数。
/* 二分查找 */ int Binary_Search(int *a, int n, int Key) { int low, high, mid; low = 1; //定义最低小标为记录首位 high = n; //定义最高下标为记录末位 while(low <= high) { mid = ( low+high )/2; //折半 if(Key<a[mid]) //若查找值比中值小 high = mid-1; //最高下标调整到中位小一位 else if (Key>a[mid]) low = mid+1; else return mid; //若相等即说明mid为查找的位置 } return 0; }
二分查找的时间复杂度为O(logn),优于顺序查找O(n)。
2.插值查找
二分查找的中值选取条件为:
改进方法:
插值查找的代码为:
mid = low+ (high-low) * (key-a[low]/a[high]-a[low])
算法时间复杂度同为O(logn),当表长度较大且关键字分布比较均匀时,使用插值查找方法效果较好!
3.斐波那契查找
Fibonacci Search 是通过黄金分割原理进行实现的。代码如下:
/* Fibonacci Search */ int Fibonacc_Search(int *a, int n, int Key) { int low,high,mid,i,k; low = 1; //定义最低下标为记录首位 high = n; //定义最高下标为记录末位 k = 0; while(n>F[k]-1) //计算n位于Fibonacci数列中的位置 k++; for(i=n;i<F[k]-1;i++) //将不满的数值补全 a[i] = a[n]; while(low<=high) { mid = low+F[k-1]-1; //计算当前分隔的下标 if(key<a[mid]) //若查找记录小于当前分隔符 { high = mid-1; //最高下标调整到分隔符下标mid-1处 k = k-1; //Fibonacci数列下标减一位 } else if (key>a[mid]) //若查找记录大于当前分隔符 { low = mid+1; //最低下标调整到分隔符下标mid+1处 k = k-2; } else { if(mid<=n) return mid; //若相等则说明mid即为查找的位置 else return n; //若mid>n,说明是补全数值,返回n } } return 0; }
三种有序表的查找本质上是分隔点的选择不同,各有优劣。
-
『算法』——静态查找——线性表查找——二分查找(折半查找/对分查找)
2020-05-16 11:54:26二分查找法只适用于从有序的队列中进行查找(比如数字和字母等),将队列排序后再进行查找。 基本思想: 假设表中元素是有序的,将表的中间位置的关键字与所需的关键字比较,相等则成功,否则分为前后两个子表,若所需... -
6-7 有序表的增删改查操作 (20分)
2020-11-22 15:47:05标题6-7 有序表的增删改查操作 (20分) 首先输入一个正整数N(1≤N≤1000...当用户输入编号1~4和相关参数时,将分别对该有序表进行插入、删除、修改和查找操作,输入其他编号,则结束操作。 本题要求实现4个函数,分别 -
二分查找实现符号表
2020-11-10 23:55:00二分查找实现符号表 算法原理 使用Keys[]和Values[]两个数组分别存储键和值 实现的核心是rank() 方法,它返回表中小于给定键的数量 对于get()方法,只要给定键...在NNN 个键的有序数组中进行二分查找最多需要log2N+ -
静态查找表算法
2019-05-30 11:50:45算法2:采用顺序存储结构创建静态查找表——有序表,对有序表进行二分查找; #include <stdio.h> #include <stdlib.h> typedef int KeyType; //typedef float KeyType //typedef char... -
算法-在有序数组、无序数组中进行折半查找和二分法找无序数组中第k小(大)的数
2018-05-17 15:34:19折半查找又称为二分查找或对分查找。 (1)基本的二分查找 使用条件: 1. 线性表中的记录必须按关键码有序。 2. 必须采用顺序存储结构。 基本思想: 在有序表中,取中间记录作为比较对象, 若给定值与中间... -
树表的查找
2018-03-14 19:25:16顺序查找、二分(折半)查找和索引查找都是静态查找表,其中二分...若要对动态查找表进行高效率的查找,可以使用树表。以二叉树或树作为表的组织形式,称为树表。一、二叉排序树 二叉排序树(简称BST)又称二叉查找... -
python实现二分查找
2017-07-27 17:41:51利用二分查找来做,事先需要对列表进行排序,二分查找只对有序表有效 下面是具体的实现: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:二分查找 ''' def binary_search(num_... -
二分查找的平均查找长度_二分查找(折半查找)代码实现
2021-01-27 15:35:39在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需要提前以该关键字对所有数据进行排序。代码完整实现代码struct SSNode{ int*... -
二分查找
2019-07-11 14:26:04二分查找其实也可以依赖链表结构,不过如果使用链表接口、那么时间复杂度就会退化到O(n),把整个数据遍历一遍进行查找的效率是一样的、甚至更低,链表不适用于二分查找。 数据必须有序 二分查找依赖于数据的有序、... -
C语言数据结构静态动态查找表实验
2020-07-07 12:57:41算法2:采用顺序存储结构创建静态查找表--有序表,对有序表进行二分查找 */ #include<stdio.h> #include<stdlib.h> #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)<... -
二分查找总结
2020-07-15 17:17:49线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。 适用情况 二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种... -
实验五 静态表上的查找操作
2020-05-26 21:20:52(1)根据输入的查找表的表长n和n个关键字值,建立顺序查找表;...(3)选择一种简单的排序方法对(1)中建立的顺序查找表进行排序; (4)在(3)中的有序查找表中用二分查找方法查找与已经给定关键值相等的记录 ; -
有序表查询之三:java实现斐波那契查询
2017-09-12 15:10:30前边分别介绍了有序表的前两种查找方式二分查找和插值查找,这里再对其另一种方式进行java实现:斐波那契查询。 直接上代码,其中数组扩容和将不满的数值补全是为了防止下标越界异常,当查询的数是有序数组中最后一... -
二分查找_二分查找又叫折半查找,是一种简单又快速的查找算法
2021-01-12 23:11:271. 作用和要求当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的...图1展示的就是一个能进行二分查找的序列。图1 有序且顺序存储的序列如果一个序列是无序的或者是链表,那么该序列就不能进行二... -
13--查找--顺序表
2020-05-03 22:17:55有序表查找 1.二分查找 2.插值查找 3.斐波那契查找 顺序查找(Sequential Search) 时间复杂度O(n) 1.顺序查找:逐个比对 2.有哨兵顺序查找:a[0] = key,倒着逐个比对 二分查找(Binary Search) 也叫折半查找 时间... -
数据结构(顺序查找、二分查找、分块查找)
2020-08-20 16:56:05折半查找(二分或对分查找),要查找的元素前提是有序的。 分块查找(索引顺序查找) 顺序查找: 性能分析:顺序查找平均查找长度为:(n+1)/2,时间效率为O(n) 优点:算法简单、适应面广,对查找表 -
数据结构(53) 顺序查找、二分查找、分块查找(索引顺序查找)
2020-08-05 16:46:361.2、有序表的顺序查找 1、顺序查找 顺序查找又称线性查找,主要用于在线性表中进行查找。顺序查找通常分为对一般的无序线性表的顺序查找和对按关键字有序的顺序表的顺序查找。下面分别进行讨论。 1.1、一般... -
“《算法导论》之‘查找’”:顺序查找和二分查找
2019-09-28 18:43:25顺序查找对于有序序列/链表和无序序列/链表都可行,但二分查找就只能对有序序列进行查找了。二分查找在查找时速度较快(lgN),不过它对序列的有序要求会导致节点插入时间的增加(相对无序序列/链表)。 《算法》... -
二分查找算法c语言_二分查找又叫折半查找,是一种简单又快速的查找算法
2020-12-03 12:27:211. 作用和要求当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法,二...图1展示的就是一个能进行二分查找的序列。图1 有序且顺序存储的序列如果一个序列是无序的或者是链表,那么该序列就... -
线性表的查找操作(线性表的顺序查找、二分查找、分块查找)
2015-11-27 19:48:57内容: ...(4)输入一个整数,利用折半查找法在有序表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。 (5)输入整组数无序,但局部有序的一组整数,建立查找表,输入 -
C语言数据结构顺序表的顺序查找和折半查找的功能
2020-05-31 20:07:54C语言顺序表顺序查找和折半查找的基本思想和应用 ...折半查找,又称二分查找,它仅适用于有序的顺序表 首先将给定值key与表中间位置元素的关键字比较,若相等,则查找成功,返回该元素的存储位置;(例如,在查