数据结构——静态查找表&动态查找表的区别用法【顺序查找-线性查找-折半查找-二分查找-有序表查找-插值查找-斐波那契查找-索引顺序表查找-分块查找】

目录:

一:静态查找表(Static Search Table)

主要操作:

二: 动态查找表(Dynamic Search Table)

主要操作:

三:顺序查找(Sequential Search)【线性查找】

1.查找过程

2.时间复杂度

四:折半查找(Binary Search)【二分查找】【有序表查找】

1.查找过程

2.时间复杂度

3.二分查找在静态查找表&动态查找表

A:静态查找表

B:动态查找表

五:插值查找(Interpolation Search)

1.查找过程

2.插值查找&二分查找的异同

A:同

B:异

六:斐波那契查找(Fibonacci Search)

1.查找过程

 2.时间复杂度

3.二分查找&插值查找&斐波那契查找的异同

A:同

B:异

七:索引顺序表查找【分块查找】

1.性能

2.查找过程


一:静态查找表(Static Search Table)

只作查找操作的查找表

主要操作:

(1)查询某个 ”特定的“ 数据元素是否在查找表中

(2)检索某个 ”特定的“ 数据元素和各种属性

静态查找表只是查询
1.顺序查找表【线性查找】:从线性表一端开始扫描,将扫到的关键字与给定值比较,相同则查找成功


2.有序表查找【折半查找】【二分查找】:若线性表有序,则可以折半查找
折半查找升级版为插值查找,及不取1/2处。斐波那契查找,也是折半查找的变种


3.索引顺序表查找【分块查找】:效率介于1)2)之间
又称分块查找。块与块之间有序,块内无序。实际进行两次查找,第一次折半查找,第二次顺序查找

二: 动态查找表(Dynamic Search Table)

查找过程中同时插入查找表中不存在的数据元素

或者从查找表中删除已经存在的某个数据元素

主要操作:

(1)查找时插入数据元素

(2)查找时删除数据元素

动态查找表可以对查找表结构进行修改

相比于静态查找表,查找过程中会修改元素

三:顺序查找(Sequential Search)【线性查找

也叫 线性查找

1.查找过程

是最基本的查找技术,它的查找过程是:

A:从表中第一个(或最后一个)记录开始

B:逐个进行记录的关键字和给定值比较

C:若某个记录的关键字等于给定值,则查找成功

D:如果直到最后一个(或第一个)记录,仍然找不到关键字与给定值相等的记录,则查找失败

2.时间复杂度

顺序查找的时间复杂度

四:折半查找(Binary Search)【二分查找】【有序表查找

又叫 二分查找

它的前提是线性表中的记录必须是关键码有序(通常从小到达有序),线性表必须采用顺序存储

1.查找过程

二分查找的基本思想是:

在有序表中

A:中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功

B:若给定值小于中间记录的关键字,则在中间记录的左半区继续查找

C:若给定值大于中间记录的关键字,则在中间记录的右半区继续查找

D:不断重复上述过程,直到查找成功

或所有查找区域无记录,查找失败为止

2.时间复杂度

二分查找的时间复杂度

3.二分查找在静态查找表&动态查找表

由于 二分查找前提条件是要求集合有序

A:静态查找表

因此,对于静态查找表,一次排序后不再变化,这样的算法已经比较好

B:动态查找表

但对于需要频繁执行插入或删除操作的数据集(动态查找表)来说

维护有序的排序会带来不小的工作量,那就不建议使用

五:插值查找(Interpolation Search)

1.查找过程

根据要查找的关键字 key

与查找表中的最大最小记录的关键字比较后的查找方法

核心在于插值计算公式

2.插值查找&二分查找的异同

A:同

插值查找 与 二分查找 的时间复杂度都是

 

B:异

但对于表长较大,而关键字分布又比较均匀的查找表来说

插值查找算法的平均性能二分查找好的多

(因为,二分查找是折半查找

而插值查找会根据要查找的 key 计算得出其在整个查找表中的权重得到的位置会更接近 key 的位置)

反之,数组中如果分布类似

这种极端不均匀的数据

用插值查找未必是很合适的选择

六:斐波那契查找(Fibonacci Search)

1.查找过程

斐波那契查找与二分查找和插值查找都是有序查找算法

不过其是利用了黄金分割原理来实现的

核心算法为:

A:当 时,查找成功

B:当时,新范围是第 low 个到第 mid-1 个,此时范围个数

C:当时,新范围是第 m+1 个到第 high 个,此时范围个数 个

 2.时间复杂度

管斐波那契查找的时间复杂度也为 

3.二分查找&插值查找&斐波那契查找的异同

A:同

二分查找插值查找斐波那契查找 都是有序查找算法

它们的本质其实是相同的,都是选择序列中间的某个位置与给定值进行比较

依据序列的有序性,每次查找都可以去除两端一部分序列,从而提升查找性能

B:异

三者的区别仅在与中间位置的选择策略不同:

二分查找直接取序列中点作为 mid

插值查找给定值在序列的权重(比例)作为 mid

斐波那契查找是用序列的黄金分割点(即:)作为 mid

但就平均性能来说,斐波那契查找优于二分查找

还有一点比较关键的地方

二分查找是进行加减法与除法运算:

mid=low+(high-low)/2

插值查找进行复杂的四则运算

mid=low+(high-low)*(key-a[low])/(a[high]-a[low])

斐波那契查找只是最简单的加减法运算

mid=low+F[k-1]-1

在海量数据的查找过程中,这种细微的差别可能会影响最终的查找效率

七:索引顺序表查找【分块查找

索引顺序查找,又称分块查找

是顺序查找的一种改进

1.性能

其性能介于顺序查找折半查找之间

2.查找过程

A:分块查找把线性表分成若干块

每一块中的元素存储顺序是任意的

但是块与块之间必须是按关键字大小排序

(即前一块中的最大关键字大于(或小于)后一块中的最小(或最大)关键字值)。

B:另外,需要建立一个索引表

索引表中的一项对应线性表中的一项

索引表按关键字值递增(或递减)顺序排列

索引项由关键字域和链域组成

关键字域存放相应块的最大关键字

链域存放指向本块第一个结点的指针

索引表查找算法:实际上进行了两次查找(折半查找+顺序查找)

因此整个算法的平均查找长度两次查找的平均查找长度之和

发布了148 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/liu17234050/article/details/104264637
今日推荐