数据结构 —— 6 散列查找

1 散列表

1.1 散列的基本思路

在这里插入图片描述
定义1个变量n
在这里插入图片描述
要使用n就要判断这个变量是否定义过,什么类型,能不能这样用

在这里插入图片描述
定义的指针变量就不能*2

在这里插入图片描述
在这里插入图片描述
查找树,AVL树,但不能完成对变量管理
在这里插入图片描述
字符串要一个一个字符的比较
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

半序:某些数之间存在顺序,比如查找树
在这里插入图片描述

1.2 什么是散列表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二维数组,但只能解决1个元素冲突
在这里插入图片描述

2 散列函数的构造方法

2.1 数字关键词的散列函数的构造方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
观察可知,第6、10、14、16、17、18位比较随机,所以取这几位出来组成
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
任意取中间的几位,不能取最后一位,因为最后一位受乘数的最后一位影响
在这里插入图片描述

2.2 字符串关键词的散列函数的构造方法

在这里插入图片描述
ASSCII值为0-127
假设变量有10位,变量名组合很多,很容易就会使和相同,就会造成冲突
在这里插入图片描述
为什么会是27?因为26个字母,还可能会有空格
在这里插入图片描述
在这里插入图片描述
x*32相当于x<<5
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 冲突处理方法

在这里插入图片描述

2.3.1 开放地址法(Open Addressing)

在这里插入图片描述
在这里插入图片描述

线性探测(Linear Probing)

在这里插入图片描述
在这里插入图片描述
注意30,多次冲突
在这里插入图片描述
反过来后,冲突的值就变了
在这里插入图片描述
在这里插入图片描述
ASLs :key值的冲突次数

  • 查找11,冲突0次
  • 查找30,冲突6次
    .。。。
    ASLu
  • 求余得0,需要比较3次,即H(key)=0,1,2,H(key)=2时没有值才停止
    在这里插入图片描述
    在这里插入图片描述

平方探测法(Quadratic Probing)—— 二次探测

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
平方探测法避免了线性探测法聚集的现象
在这里插入图片描述

平方探测法的实现

希望表的大小为素数,所以使用NextPrime(TableSize),比如TableSize为12,就找一个素数13
在这里插入图片描述
在这里插入图片描述
对每个元素做一个标记,表示该元素的状态(empty,delete,…)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

双散列探测法

在这里插入图片描述

再散列

在这里插入图片描述
例如:当把mod的值11换为23后,所有散列值(散列地址)都要重新计算
在这里插入图片描述

2.3.2 分离链接法(Separate Chaining)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4 散列表的性能分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.1 线性探测法的查找性能

在这里插入图片描述
在这里插入图片描述

2.4.2 平方探测法和双散列探测法的查找性能

在这里插入图片描述
在这里插入图片描述

2.4.3 分离链接法的查找性能

在这里插入图片描述

2.4.4 散列表性质

在这里插入图片描述

2.4.5 开放地址法与分离链接法

在这里插入图片描述
在这里插入图片描述

2.5 应用实例:词频统计

在这里插入图片描述
在这里插入图片描述

小白专场:电话聊天狂人(C语言实现)

猜你喜欢

转载自blog.csdn.net/qq_42713936/article/details/106063100