一、哈希表
将关键字作为自变量,使用哈希函数H(key),得到该记录的存储地址。
这一映射过程,称为哈希造表、散列;所得的存储位置 = 哈希地址、散列地址。
1-1、冲突的定义
两个关键字K1和K2,K1 != K2,,但是,H(K1) = H(K2)。
此时,K1,K2是同义词。
冲突是不可避免的,但是应该尽量减少。
减少冲突:哈希函数,尽可能均匀的把关键字映射到存储区的各个存储单元。
尽可能的使关键字的所有组成部分都能起作用。
1-2、哈希函数的构造方法——除留余数法
若是有n个元素,m取接近n但是不大于n的质数。
比如有11个元素,地址为 0 1 2 3 4 5 6 7 8 9 10,所以m = 11
1-3、处理冲突的方法
1、开放地址法
常见的增量序列有3种:
线性探测法示例:
线性探测法,就是第i个位置冲突了,就看第i+1个位置,要是还冲突,就看第i+2个位置。
聚集现象:
线性探测法可能使第i个哈希地址的同义词存入第i+1 个哈希地址,这样本应存入第i+1个哈希地址的元素变成了第i+2 个哈希地址元素的同义词,.....,因此,可能出现很多元素在相邻的哈希地址上“聚集”起来的现象,大大降低了查找效率。
2、链地址法(拉链法)
示例:
1-4、哈希表的查找
在查找过程中需要和给定值进行比较的关键字的个数取决于下列3个因素:
- 哈希函数
- 处理冲突的方法
- 哈希表的装填因子
1-4-1、装填因子
一般情况下,冲突处理方法相同的哈希表,其平均查找长度依赖于哈希表的装填因子。哈希表的装填因子定义为:
a标志着哈希表的装满程度。
直观地看,a 越小,发生冲突的可能性就越小;反之,a 越大,表中已填入的记录越多,再填记录时,发生冲突的可能性就越大,则查找时,给定值需与之进行比较的关键字的个数也就越多。
1-5、真题
真题1:
真题2:
真题3:
哈希表是动态查找表,可以添加、删除元素。
真题4:
真题5:
真题6:
真题7:
二、堆
2-1、小顶堆
2-2、大顶堆
示例:
2-2-1、大根堆的建立
示例:为序列 (55,60,40,10,80,65,15,5,75)建立初始大根堆的过程:
当左子树、右子树都大于根节点的时候,选择最大的子节点交换。
当根节点交换后,要看交换下去的子节点,会不会影响它的子树。
2-3、真题
真题1:
真题2:
真题3: