Hash
1. 什么是hash
压缩映射
优点:哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。
2. 相关概念
散列表=哈希表; 散列函数=哈希函数;
3. 单向
它是一种单向函数是“非对称”的,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。
4. 哈希查找的两个步骤
[1] 使用哈希函数将被查找的键转换为数组的索引。
[2] 处理哈希碰撞冲突。
5. 常用的希哈函数
(博客:https://blog.csdn.net/tanggao1314/article/details/51457585)
[1] 直接定址法:线性函数。
优点:简单。
缺点:造成空间大量的浪费。
[2] 数字分析法:分析关键字集中的全体,并从中提取分布均匀的若干位或它们的组合作为地址。
适用范围:所有关键字值已知。
[3] 折叠法:移位叠加/边界叠加。
适用范围:关键字的数字位数特别多。
[4] 平方取中法(常用):这个方法是先取关键字的平方,然后根据可使用空间的大小,选取平方数是中间几位为哈希地址。
优点:扩大差别。
适用范围:关键字中的每一位都有某些数字重复出现频度很高的现象。
[5] 除留余数法:理论研究表明,除数最好为素数。
6. 哈希冲突解决办法
[1] 开放定址法(再散列法):当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1... 直到找出一个不冲突的哈希地址pi。
Hi=(H(key)+di)% m i=1,2,…,n
a) 线性探测再散列di=1,2,3,…,m-1
b) 二次探测再散列di=1^2,-1^2,2^2,-2^2,…,k^2,-k^2
c) 伪随机探测再散列di=伪随机数序列。
线性探测再散列的优点是:只要哈希表不满,就一定能找到一个不冲突的哈希地址,而二次探测再散列和伪随机探测再散列则不一定。
[2] 再哈希法: 这种方法是同时构造多个不同的哈希函数
Hi=RH1(key) i=1,2,…,k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
[3] 链地址法:这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。(平均查找长度 ASL=a*1+b*2+.../n)
[4] 建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表