数据结构——线性结构(哈希表)
一、直接寻址表
如果某应用要用到一个动态集合,其中每个元素都是全域U={0,1….,m}中的一个关键字 为表示动态集合,使用数组。称为直接寻址表,记为T[m],其中每个位置称为一个槽slot,对应于全域中的一个关键字。槽k指向集合中一个关键字为k的元素。如果该集合中没有关键字为k的元素,则T[k]=NIL;
1、直接寻址技术优点
当关键字的全域U比较小时,直接寻址是一种简单而有效的方法。
2、直接寻址技术缺点
当域U很大时,需要消耗大量内存,很不实际;
如果域U很大而实际出现的key很少,则大量空间被浪费;
无法处理关键字不是数字的情况。
3、将直接寻址表改进为哈希表
直接寻址表:key为k的元素放到k的位置上。
改进方法:
(1)构建大小为m的寻址表T;
(2)key为k的元素放到h(k)位置上;
(3)h(k)是一个函数,其将域U映射到表T[0,1,...,m-1]。
二、哈希表
在直接寻址表上加了一个哈希函数就成了哈希表。
哈希表(Hash Table,又称为散列表),是一种线性表的存储结构。哈希表由一个直接寻址表和一个哈希函数组成。哈希函数h(k)将k作为自变量,返回元素的存储下标。
假设有一个长度为7的哈希表,哈希函数h(k)=k%7。元素集合{14,22,3,5}的存储方式如下图:
14%7=0,因此14存在index=0的位置;22%7=1,因此22存在index=1的位置;3%7=3,因此3存在index=3的位置;5%7=5,因此5存在index=5的位置。
1、常见哈希函数
- 除法哈希法:h(k) = k mod m # mod就是% # 除留余数法
- 乘法哈希法:h(k) = floor(m*(A*key%1)) 0<A<1 # 对1取模也就是取它的小数部分, floo