常见的查找算法
顺序查找( 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的平方。
再哈希就是一开始就先设置一系列的哈希函数,如果使用第一种哈希函数出现溢出时就改用第二种,如果第二种也出现溢出则改用第三种,一直到没有发生溢出为止。