哈希表
- 哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1)
- 散列函数计算得到的散列值是一个非负整数
- 如果 key1 = key2,那 hash(key1) == hash(key2)
- 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)
1. 哈希函数
- 除留余数法 Hash(key)=key MOD p (p<=m m为表长)//MOD 取模运算 6%10=6
- 直接定制法 取关键字的某个线性函数为散列地址 Hash(Key)= A*Key + B
- 平方取中法 关键字的每一位都有某些数字重复出现频率很高的现象,可以先求关键字的平方值,通过平方扩大差异,而后取中间数位作为最终存储地址
2. 哈希冲突
- 从前向后插入数据,如果插入位置已经占用,发生冲突,冲突的另起一行,计算地址,直到地址可用,后面冲突的继续向下另起一行。最终结果取最上面的数据(因为是最“占座”的数据)
- 伪随机数列di,产生的Hi(地址)均不相同,且所产生的s(m-1)个Hi能覆盖hash表中的所有地址
2.1 线性探测再散列
- 冲突后存储在冲突后一个位置,如果仍然冲突继续向后 di=c∗i
2.2 平方探测再散列
- di=12,-12,22,-22
2.3 随机探测在散列
- H(key)=(H(key)+di)MOD m ;di=key MOD 10 +1
2.4 链地址法
- 产生hash冲突后在存储数据后面加一个指针,指向后面冲突的数据
3. hash表的查找
- 对于给定的key,计算hash地址index = H(key)
- 如果数组arr【index】的值为空 则查找不成功
- 如果数组arr【index】== key 则查找成功
- 否则使用冲突解决方法求下一个地址,直到arr【index】== key或者 arr【index】==null