常见的查找算法

常见的查找算法

顺序查找( O(n) )

:当数据量很大的时候,不适合使用顺序查找法。


二分查找(O(log 2 .n))

:二分法必须事先经过排序,且数据量必须能直接在内存中执行

: 此方法适合用于不需要增删的静态数据


插值查找法(二分查找的改版)

按照数据位置的分布,利用公式预测数据的所在位置,再以二分法的方式渐渐逼近。

此算法的时间复杂度取决于数据的分布状况平均而言由于O(log2(n)),一般而言,插值查找法优于顺序查找法,如果数据的分布更平均,则查找速度会更快

:使用插值寻找必须事先经过排序


哈希查找法

哈希法不仅被用于数据的查找,在数据结构的领域中,还能将它应用于数据的建立,插入,删除和更新

所谓哈希法(Hashing)就是将本身的键值,通过特定的数学函数运算或使用其他的方法,转换成相对应的数据存储地址

bucket(桶):哈希表中存储数据的位置,每一个位置对应唯一的一个地址(bucket address)。桶就好比一个记录。

若两笔不同的数据,经过哈希函数运算后,对应到相同的地址,称为碰撞

当两个标识符I1和I2,经哈希函数运算后所得的数值相同,即f(I1)=f(I2),则称I1与I2对于f这个哈希函数是同义词
加载密度是指标识符的使用数目除以哈希表内槽的总数。

完美哈希(perfect hashing):指没有碰撞又没有溢出的哈希函数。


常见的哈希法

常见的哈希法有除留余数法、平方取中法、折叠法及数字分析法。

最简单的路希面数是将数据除以某一个常数后,取余数来当索引。这种方法称为除留余数法。
平方取中法是把数据乘以自己,之后再取中间的某段数字做索引。
折叠法是将数据转换成一串数字后,先将这串数字拆成数个部分,最后再把它们加起来,就可以计算出这个键值的Bucket Address。

数字分析法适用于数据不会更改,且为数字类型的静态表。在决定哈希函数时先逐一检查数据的相对位置及分布情形,将重复性高的部分删除。


常见的溢出处理方法

常见的溢出处理方法如下:线性探测法、平方探测、再哈希、链表。
线性探测法通常把哈希的位置视为环形结构,如此一来若后面的位置已被填满而前面还有位置时,可以将数据放到前面。
在平方探测中,当溢出发生时,下一次查找的地址是(f(x)+i2)mod B与(f(x)-i2)mod B,即让数据值加或减i的平方。
再哈希就是一开始就先设置一系列的哈希函数,如果使用第一种哈希函数出现溢出时就改用第二种,如果第二种也出现溢出则改用第三种,一直到没有发生溢出为止。



猜你喜欢

转载自blog.csdn.net/Hyo555/article/details/80030861