【笔记】
函数h将关键字域U映射到散列表T[0..m-1]的槽位上。h(k)是关键字k的散列值。
碰撞:两个关键字映射到同一个槽上。
链接法:把散列到同一槽中的所有元素都放在一个链表中。
给定一个能存放n个元素的、具有m个槽位的散列表T,定义T的装载因子α为n/m,即一个链中平均存储的元素数。
对一个用链接技术来解决碰撞的散列表,在简单一致散列的假设下,一次不成功查找的期望时间为θ(1+α)。
在简单一致散列的假设下,对于用链接技术解决碰撞的散列表,平均情况下一次成功的查找需要θ(1+α)时间。
平均来说,查找操作需要常数常量的时间。
【练习】
11.2-1 假设用一个散列函数h,将n个不同的关键字散列到一个长度为m的数组T中。假定采用的是简单一致散列法,那么期望的碰撞数是多少?更准确的,集合{{k,l}:k!=l,且h(k)=h(l)}的期望的基是多少?
不会!
11.2-2 对于一个用链接法解决碰撞的散列表,说明将关键字5、28、19、15、20、33、12、17、10插入到该表中的过程。设该表中有9个槽位,并设散列函数为h(k)=k mod 9。
11.2-3 Marley教授做了这样一个假设,即如果将链接模式改动一下,使得每个链表都能保持已排序顺序,散列的性能就可以有很大的提高。Marley教授的改动对成功查找、不成功查找、插入和删除操作的运行时间有什么影响?
查找仍与链表长度成正比,唯一的区别是插入操作也与链表长度成了正比。
11.2-4 说明在散列表内部,如何通过将所有未占用的槽位链接成一个自由链表,来分配和去配元素的存储空间。假定一个槽位可以存储一个标志、一个元素加上一个或两个指针。所有的字典和自由链表操作应具有O(1)的期望运行时间。该自由链表需要是双链表吗?
应该是双向链表。
初始化时相邻槽之间两个指针指向前驱与后继。
存储槽x时,x前驱的后继为x的后继,x后继的前驱为x前驱,即可将空槽删去一个。
11.2-5 证明:如果|U|>nm,有一个U的大小为n的子集,它包含了均散列到同一槽位中的关键字,这样对于带链接的散列表,最坏情况下的查找时间为θ(n)。