查找算法

(一)顺序查找算法

1.顺序查找,又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功

2.顺序查找算法的时间复杂度是O(n)

(二)有序查找算法

1.折半查找算法

(1)折半查找技术,又称为二分查找;它的前提是线性表中的记录必须是关键字有序(通常从小到大有序),线性表必须采用顺序存储;折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找;不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止;计算分隔点的公式如下:

《查找算法》

(2)折半查找算法的时间复杂度是O(logn)

《查找算法》

2.插值查找算法

(1)插值查找算法是对折半查找算法的改进,折半查找是以对半分来查找,而插值查找不一定是对半;它假设关键字分布均匀,是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找算法;计算分隔点的公式如下:

《查找算法》

(2)插值查找算法的时间复杂度是O(logn)

3.斐波那契查找算法

(1)斐波那契查找算法是基于斐波那契数列进行分割查找的;

           1)已知斐波那契数列如下:

                  《查找算法》

              2)如果一个有序表的元素个数为n,并且n正好是(某个斐波那契数 – 1),即n=F[k]-1时,才能用斐波那契查找法;

                     如果有序表的元素个n不等于(某个斐波那契数-1) ,即n≠F[k]-1,这时必须要将有序表的元素扩展到大于n的那个斐波那契数 – 1才行;

          基于以上2点,斐波那契查找的分隔点如下:

《查找算法》

      《查找算法》

(2)斐波那契查找算法的时间复杂度是O(logn)

4.对比

(1)三种有序表的查找本质上是分隔点的选择不同,各有优劣,实际开发时可根据数据的特点综合考虑再做选择

(2)折半查找分隔点的计算包括加法跟除法;插值查找分隔点的计算包括加减乘除;斐波那契查找分隔点的计算包括加减法;

(三)散列表(哈希表)查找算法

1.散列表(哈希表):是根据关键字(Key value)而直接访问在内存存储位置的数据结构;也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度;这个映射函数称做散列函数,存放记录的数组称做散列表;

《查找算法》

PS:散列技术既是一种存储方法,也是一种查找方法

2.散列函数的构造方法

(1)直接定址法

(2)数字分析法

(3)平方取中法

(4)折叠法

(5)除留余数法

(6)随机数法

3.散列表查找步骤

(1)在存储时,通过散列函数计算记录的散列地址,并按此散列地址存储该记录

(2)当查找记录时,我们通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录

4.散列冲突:如果两个不同的关键字,却计算出相同的散列地址,这种现象称为散列冲突

5.散列冲突的处理方法:

(1)开放地址法:线性探测法,二次探测法,随机探测法

(2)再散列函数法

(3)链地址法

(4)公共溢出区法

6.哈希表插入的时间复杂度与冲突次数有关;如果没有冲突,散列查找的时间复杂度是O(1);最坏情况是冲突n次,时间复杂度为O(n)

(四)索引

1.稠密索引

《查找算法》

2.分块索引(块内无序,块间有序)

《查找算法》

3.倒排索引

(1)概念:索引项的结构包括次关键码以及记录号表;其中记录号表存储具有相同次关键字的所有记录的记录号,这样的索引方法就是倒排索引‘

(2)例子:

记录如下:

《查找算法》

倒排索引如下:

《查找算法》

PS:

静态查找表:只做查找操作的查找表

动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素

1.二叉查找树:时间复杂度为O(n)

2.平衡二叉树:时间复杂度为O(logn)

3.红黑树:时间复杂度为O(logn)

4.B+树:时间复杂度为O(logn)

    原文作者:查找算法
    原文地址: https://blog.csdn.net/dream_catcher_10/article/details/50639856
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞