基本原理:
哈希表(散列表)的基本原理:
使用一个下标范围比较大的数组来存储元素,一般通过设计一个函数(哈希函数,即散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,然后用该数组单元来存储对应元素。
函数构造:
无定式,方法很多
最常见的方法:除余法
H(k ) = k mod p (p一般选取适当大的素数)
常用的经典字符串Hash以后介绍
冲突:
由于不能够保证每个元素的关键字与函数值是一一对应的,因此很有可能出现如下情况:
“对于不同的元素关键字,Hash函数计算出了相同的函数值”,这就是产生了所谓的“冲突”。
换句话说,就是Hash函数把不同的元素分在了相同的下标单元。
冲突解决:
方法很多~
常用方法:线性探测再散列技术
即:当 h(k)位置已经存储有元素的时候,依次探查 (h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中, S为 数组长度。
特别地,如果将数组扫描一圈仍未发现空单元,则说明哈希表已满,这会带来麻烦,但是,该情况完全可以通过扩大数组范围来避免。
基本操作:
Hash表初始化(0或-1或其它)
哈希函数运算
插入元素(包含冲突解决)
定位(需考虑可能冲突的情况)
总结:
Hash函数评价标准:
低冲突率
易于编码
Hash函数特点:
优点:数据存储和查找效率高
(几乎是常数时间)
缺点:消耗较多内存(内存很便宜哪~)
Hash主要应用:
查找元素是否属于集合
搜索中的状态表示