博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是二分查找、插值查找、斐波那契查找和索引查找?
阅读量:1823 次
发布时间:2019-04-25

本文共 1779 字,大约阅读时间需要 5 分钟。

引言

原文链接:  希望点进去的小伙伴关注一下我的公众号哟,文末有二维码,谢谢!

 

1、查找是什么?

 

术语 解释
查找表 同一类型数据元素构成的集合
关键字 数据元素中某个数据项的值
查找 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素
静态查找表 查找时不做插入或删除操作。适用于用线性表存储,可以采用顺序查找或折半查找
动态查找表 查找时会有插入或删除操作,适用于二叉树。

 

先介绍两种查找算法:

  • 顺序表查找:这个就是按顺序从前往后查找,没啥好说的。

  • 有序表查找(必须有序)

 

有序表查找有三种:

  • 折半查找(二分查找)

  • 插值查找

  • 斐波那契查找(待补充)

 

2、折半查找

 

优点:

相对于顺序查找而言,效率高。

缺点:

  1. 如果经常插入或删除元素,则还需要另外维护元素的有序性,而且由于是顺序存储,会带来不小的工作量。

  2. 如果要查的是一个很小的元素,为什么要从中间开始折半查找呢?

    比如[1,3,5,9,10,20,35,39,50,78,139]这个顺序表,我想查3这个元素,从中间的位置开始折半查找效率并不是很高。

  3. 这时候就出来一个插值查找,是对二分法的改进。

 

3、插值查找

 

折半查找的公式是:

middle_index = (min_index+max_index)/2

 

将上面的公式做一下数学变换:

middle_index =min_index+1/2*(max_index-min_index)

这个公式的意思是:

middle_index =最小索引+(最大索引与最小索引差值的二分之一)

 

重点就在于这个二分之一,插值查找的改进方案是:

将1/2换成(key-a[min_index])/(a[max_index]-a[min_index])

a是数组名,key是要查找的值。

 

3、斐波那契查找

 

斐波那契数列(又叫兔子数列、黄金分割数列)

如果兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一

对小兔子来。假设所有兔都不死,那么一年以后可以繁殖多少对兔子?

图片

这个数列有一个很明显的特征,每一项的值等于前两项之和。用数学函数来定义,如下图所示。

图片

 

那和黄金分割又有什么关系呢?

因为随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值 0.6180339887

 

4、线性索引查找

上面讲到了顺序表和有序表的查找:

  • 顺序表的查找效率是最低的

  • 有序表的查找相对而言比较快,但这是建立在有序的基础上,如果数据量非常大,维护有序性代价太大了,一般大量的数据都是按先后顺序入库的

 

对于这样的查找表,解决办法就是通过索引。索引是为了加快查找速度而设计的一种数据结构。

索引有多个索引项,而每个索引项至少包含关键字和对应的记录在存储器中的位置两个字段。

 

索引按存储结构可分为如下几种:

  • 线性索引:也叫索引表,用线性结构存储索引项

  • 树形索引

  • 多级索引

 

线性索引又可以分为如下三种:

  • 稠密索引

  • 分块索引

  • 倒排索引

下面简单介绍一下这三种索引。

 

4.1、稠密索引

 

数据集中的每一个记录都对应一个索引项,即数据与索引是一对一关系。

假如有一万条数据,那么就对应一万条索引项,数据是无序的,而索引项是有序的,通过有序表的查找算法先查找索引项,然后再通过一对一关系迅速找到数据。

这种索引的缺点很明显,就是太占空间了。

 

4.2、分块索引

 

分块索引的典型例子是图书馆的书架。

分块就是将数据集分成若干块,块内可以无序,而块间是有序的。

 

每个索引项有三个字段:

  • 对应分块的最大关键字

  • 块长

  • 块首数据元素的指针

 

分块与索引项的关系如下图所示。

图片

 

查找步骤就是:

  • 如果要查找关键字62,因为57<62<96,根据块首指针,很容易定位到第三块的块首

  • 由于块内无序,因此只能在第三块内顺序查找

 

4.3、倒排索引

 

搜索引擎中最基础的搜索技术就是倒排索引。

 

假如有两篇文章,然后我们把每篇文章的关键字提取出来,如下表所示。

文章1 qq,微信,淘宝
文章2 天猫,微信

我们可以根据某篇文章找到该文章的关键字,这样的存储结构叫正排索引。

 

相反地,如果能根据关键字找到对应的文章,就叫倒排索引,因此我们可以将存储结构做一下变换,如下表所示。

qq 文章1
微信 文章1,文章2
淘宝 文章1
天猫 文章2

 

 

我的二维码

觉得写得不错的小伙伴,扫码关注一下我的公众号吧,谢谢呀!

 

转载地址:http://rppkf.baihongyu.com/

你可能感兴趣的文章
vnc远程桌面精灵,细数3款vnc远程桌面精灵
查看>>
Druid连接池基本使用(转载)
查看>>
vnc远程桌面,vnc远程桌面使用教程图解
查看>>
字符流文件读取与写入(转载)
查看>>
vnc远程连接,vnc远程连接报错如何解决
查看>>
python excel表操作(两个excel合并为)(转载)
查看>>
vnc远程连接ubuntu,vnc远程连接ubuntu教程图解
查看>>
vnc怎么设置自适应屏幕,vnc怎么设置自适应屏幕的2种方法
查看>>
10Java反射-1. 虚拟机类加载机制(概述,类加载过程,类的初始化时机)(转载)
查看>>
tightvnc安装配置,tightvnc安装配置教程
查看>>
leapftp怎么上传,小编教你leapftp怎么上传文件
查看>>
Appium自动化测试——测试流程
查看>>
接口测试中常见问题
查看>>
测试开发面试总结(一)
查看>>
移动端测试踩过的坑
查看>>
RuntimeException: Method ___ not mocked
查看>>
Vue入门笔记(一)——目录结构
查看>>
Vue入门笔记(二)——路由
查看>>
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers!
查看>>
Robolectric常用方法
查看>>