1.3.1、哈希查找-链地址法
资讯网址:www.qghkt.com
腾讯课堂:https://qghkt.ke.qq.com/20个常用算法
根据设定的哈希函数Hash(key)和处理冲突的方法,将一组关键码映射到一个有限的连续的地址集(区间)上,并以关键码在地址集中的“像”作为记录在表中的存储位置,这种表称为哈希表,这一映射过程称为哈希造表或散列,所得的存储位置称为哈希地址或散列地址。
对于某个哈希函数Hash和两个关键码K1和K2,如果K1≠K2而Hash(K1)=Hash(K2),则称为出现了冲突,对该哈希函数来说,K1和K2称为同义词。
一般情况下,冲突不能完全避免,只能尽可能地去减少冲突,因此在建造哈希表时不仅要设定一个“好”的哈希函数,而且要设定处理冲突的方法。
其中,Hash(key)为哈希函数;m为哈希表的表长;为增量序列。
常见的增量序列有如下3种:
① =1,2,3,…,m-1,称为线性探测再散列
② =,,,…,(k),称为二次探测再散列
③ =伪随机序列,称为随机探测再散列。
2)链地址法
【基本思路】
根据哈希函数得到元素所在链表的头指针,然后在链表中进行顺序查找即可。
【图解过程】
设关键码序列为47,34,19,12,52,38,33,57,63,21,哈希表表长为11,哈希函数为Hash(key) = key mod 11。
哈希地址 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
关键码 |
˄ |
˄ |
˄ |
˄ |
|||||||
|
33 |
34 |
57 |
47 |
|
38 |
|
|
19 |
|
21 |
|
˄ |
˄ |
˄ |
|
˄ |
|
|
|
˄ |
||
|
|
12 |
|
|
|
|
|
|
52 |
|
|
|
|
˄ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
|
|
|
|
|
|
|
|
|
|
|
˄ |
|
|
【适用场景】
依据记录的关键码直接得到其对应的存储位置,即要求记录的关键码与其存储位置之间存在一一对应关系,从而快速地找到记录。
【算法代码】
/////链式
//定义哈希表中的节点
typedef structnodeInfo
{
int key;
struct nodeInfo *next;
}structNodeInfo;
/****************************************************************
* 函数名称:createChainHashTable
* 功能描述:造链式的哈希表
* 参数说明:hashArr, 结构体的哈希表
* hashLen,哈希表的表长,以及是modvalue.
* keyArr,关键码的序列
* keyLen,关键码序列的长度
* 返回 值:void
* 作 者:www.qghkt.com
* 创建时间:
*****************************************************************
* Copyright @ 清哥好课堂 All rightsreserved
*****************************************************************/
voidcreateChainHashTable(structNodeInfo*hashArr[], int hashLen, int keyArr[], intkeyLen)
{
//造哈希表
int i;
//初始化
for (i = 0; i < hashLen; i++)
{
hashArr[i] = NULL; //空
}
for (i = 0; i < keyLen; i++)
{
int hashAdd = keyArr[i] % hashLen;
structNodeInfo *p =(structNodeInfo *)malloc(sizeof(structNodeInfo));
p->key = keyArr[i];
p->next = NULL;
if (hashArr[hashAdd] == NULL)
{
//当前为空
hashArr[hashAdd] = p;
}
else
{//不为空,要遍历整个链,把p接到链的最后位置
structNodeInfo *pTemp =hashArr[hashAdd];
while (pTemp->next !=NULL)
{
pTemp =pTemp->next;
}
pTemp->next = p;
}
}
}
/****************************************************************
* 函数名称:chainHashSearch
* 功能描述:链式哈希表的查找
* 参数说明:hashArr,哈希表
* hashLen,哈希表的表长,以及是哈希函数的mod值
* value,要查找的值
* 返回 值:如果不存在,返回-1, 如果存在,返回哈希表中的位置
* 作 者:www.qghkt.com
* 创建时间:
*****************************************************************
* Copyright @ 清哥好课堂 All rightsreserved
*****************************************************************/
intchainHashSearch(structNodeInfo *hashArr[], int hashLen, int value)
{
int hashAdd = value % hashLen;
structNodeInfo *p = hashArr[hashAdd];
while (p != NULL)
{
if (p->key == value)
{//找到了对应的值
return hashAdd;
}
p = p->next;
}
return -1;
}