【算法视频】哈希查找-链地址法

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;

}

    原文作者:哈希算法
    原文地址: https://blog.csdn.net/hnyjwang/article/details/81053757
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞