数据结构--哈希查找

一、散列表(哈希表)

 

  1. 根据key直接访问内存的存储结构。散列表建立了关键字与存储地址之间直接映射的关系。
  2. 查找的时间复杂度O(1)
  3. 散列表的查找效率取决于三个因素:散列函数、处理冲突的方法、装填因子α。
    1. 装填因子计算:a = \frac{n}{m} 。 其中,n是表中记录数m是表长
    2. 散列表平均查找长度不直接依赖于表中记录数n和表长m。
    3. α越大,表示装填的记录越满,发生冲突的可能性越大。
  4. ★注意查找成功查找失败时的平均查找长度的计算。


二、散列函数 H(key)

        1. 直接定址法:

                H(key) = key 或者 H(key) = a*key+b

        2. 除留取余法

                H(key) = key%p  (假设表长为m,p取不大于m的最大质数)

        3. 数字分析法:

                r进制的关键字,r个数码在各位上出现的频率不一定相同,可能在某些位上分布的均匀一些,每种数码出线机会相等;也有可能某些位上分布不均匀,只有几种数码经常出现。此时应该选择数码分布均匀的若干位作为散列地址。

        4. 平方取中法:

                取关键字平方值中间几位作为散列地址。


三、处理冲突的方法:

1. 开放定址法:

        (1)线性探测法:

                a) 发生冲突后,顺序查看表中下一个单元,直到找到一个空闲单元。

                b) 容易造成大量元素在相邻的散列地址聚集(堆积)的现象。

        (2)平方探测法:

                a) 发生冲突后,对当前下标进行处理,分别加上 0^{2}, 1^{2}, -1^{2}, 2^{2}, -2^{2}......直到找到空闲单元。

                b) 可以有效降低“堆积”现象的出现。

        (3)再散列法:

                a) 需要两个散列函数,在发生冲突后,对该下标使用第二个散列函数计算其增量

                b) H_{i} = \left ( H(key) + {\color{Magenta} i}*{\color{Red} Hash_{2}(key)} \right )%m 。其中 i是冲突的次数。

2. 链地址法:

        (1) 将同义词存储在 以下标为头的线性链表中。

        (2) 适合经常插入、删除的情况。


四、例题

首先明确下如何求查找成功、查找失败时的平均查找长度

  1.  ★ ★查找成功的平均查找长度:比较次数   / (关键字个数) ★ ★  
  2.  ★ ★查找失败的平均查找长度:查找到空位置的比较次数   /  ( H(key)的mod数 ) ★ ★

特别注意查找失败的平均查找长度求法:查找到空位置的比较次数是0~ mod-1 这些位置,依次向后查找查找到内容为空的单元  的比较次数。与采用什么样的冲突解决方法无关。(对比下面线性探测法和平方探测法的例题去理解)

线性探测法例题:

解:

数据结构--哈希查找_第1张图片

数据结构--哈希查找_第2张图片

这里比较次数,就是步骤(一)构建散列表的插入时比较次数,因此有必要在建表时记录。

数据结构--哈希查找_第3张图片

 注意是  位置0~mod-1


平方探测法例题:

解:

数据结构--哈希查找_第4张图片

 数据结构--哈希查找_第5张图片

数据结构--哈希查找_第6张图片


链地址法例题:

解:

 数据结构--哈希查找_第7张图片

数据结构--哈希查找_第8张图片

数据结构--哈希查找_第9张图片

数据结构--哈希查找_第10张图片

注意是  位置0~mod-1

有的题目会明确说,查找失败只计入关键字比较次数,与null比较不算在内。则有几个元素,查找几次。

参考:

bilibili 狂暴的南希

你可能感兴趣的:(#,数据结构笔记,数据结构,散列表,哈希)