1、 什么是哈希:哈希表(hashtable)就是一种以 键-值(key-indexed) 存储数据的结构。也叫散列表。是数据内容与存储地址之间的映射关系
2、 简单点说就是将key通过散列函数得到一个整数,用它对数组长度取余,结果就是数组的下标即value的存储位置。
a) 查找:再次利用哈希函数将key转换为数组下标值,就定位到该空间获取value
3、 利用哈希函数算法在时间与空间上找到一个平衡,为了节省空间,设定可以有多个键被哈希到同一个数组下标处,当然为了时间,哈西碰撞冲突不可能太深。
a) 充分利用数组与链表的优点。(字典查字的例子很生动)
b) 数组get、set容易(即寻址)
c) 链表的add与delete容易(但是寻址困难)
4、 解决哈希冲突有四种方法:
a) 链地址法:遇到冲突,在原地址新开辟空间已链表的形势维护
b) 再散列法(开放寻址法):就是如果key算出来的地址p有冲突的话,那就根据再散列函数得到p1,如果还冲突,那就再找p2,如此找下去,得到新的存放地址。Hi=(H(key)+di)% m i=1,2,…,n(m为数组即表长)(主要是di形式有三种)
i. 线性探测再散列
ii. 二次探测再散列
iii. 创建伪随机探测再散列
c) 再哈希法:创建多个哈希函数备用,这个不易产生聚集,但是计算时间长
d) 建立公共溢出区:将表分为基本表与溢出表
5、 特点:
a) 不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。
b) 它是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重。
c) 默认初始长度16、增长因子:0.75
d) 链表的阀值为8
6、 哈希函数(分数据类型)(它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。hash算法一般用于快速查找和加密。)
a) 整数的函数算法
i. 求模散列法
ii. 平方取中
iii. 斐波纳挈
iv. 数字分析法(比如生日,后几位明显就冲突少)
b) 浮点数的函数算法
c) 字符串的函数算法
i. BKDRHash
ii. APHash
iii. Times33(DJBHash)
7、d-left hashing
8、JDK中1.7与1.8
红黑树查找元素复杂度为O(logN),提高了查找效率