大话数据结构第八章 查找

(静态查找表算法)

*顺序表查找

优化:设置一个哨兵。

时间复杂度:O(n)

*有序表查找

***折半查找(二分查找) O(logn)

***折半改进:插值查找:mid=(key-a[low])/(a[high]-a[low])(high-low)+low  O(logn),但是对于表长较长,分布较为均匀的查找表而言,它的平均性能比折半查找好得多

***斐波那契查找  O(logn) 它的平均性能优于折半查找

*线性索引查找

***稠密索引,建立索引项,索引项按照关键码有序排列,查找关键字时可以用折半、插值、斐波那契等有序查找算法。但是如果数据量过大,索引规模也会同样大,对于内存有限的计算机,需要反复访问吃饭,查找性能反而降低。

***分块索引(图书馆),对数据集进行分块,对每个块建立索引,减少索引项个数。

块内无序;块间有序:第二块中所记录的关键字要大于第一块中记录的关键字

先用有序查找找到所在的块,再在块中进行顺序查找

***倒排索引(搜索引擎使用)

索引项的通用结构:次关键码(如Term),记录号表(如DocID)

大话数据结构第八章 查找_第1张图片

   当用户在主页上搜索关键词“华为手机”时,假设只存在正向索引(forward index),那么就需要扫描索引库中的所有文档,找出所有包含关键词“华为手机”的文档,再根据打分模型进行打分,排出名次后呈现给用户。因为互联网上收录在搜索引擎中的文档的数目是个天文数字,这样的索引结构根本无法满足实时返回排名结果的要求。所以,搜索引擎会将正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词。

(动态查找表算法:边查找边插入或删除)

*二叉排序树

顺序表无序但删除、插入快;有序表有序但删除、插入慢;二叉树既有序,同时删除、插入速度快。

二叉树的查找速度取决于树的深度。如果深度与完全二叉树相同,时间复杂度为O(logn),如果情况最坏,时间复杂度为O(n);

*平衡二叉树:左右子树高度差最多为1,此时,查找、插入、删除的时间复杂度为O(logn)

*多路查找树(每个结点的孩子可以多于两个,且每个结点处可以存储多个元素;针对内存和外存之间的存取而专门设计;2-3树等)

*散列表(哈希表)查找:在记录的存储位置和它的关键字之间建立一个确定的对应关系(称为散列、哈希函数),是的每一个关键字对应一个存储位置,该存储空间称为散列、哈希表。

分两步:
1.存储时,通过哈希函数计算散列位置,并将记录存入散列位置。

2.查找时,通过同样的哈希函数计算散列位置,并访问。

哈希冲突:不同的关键字通过该哈希函数计算得到同一地址,设计哈希函数时,不可避免但应尽量避免。

你可能感兴趣的:(数据结构笔记)