确定Hash散列函数和解决哈希冲突的方法:
https://blog.csdn.net/weixin_40567229/article/details/81137993?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
HashSearch流程 :
1.哈希表
1)确定哈希散列函数,我这里用的是求整取余法
2)定解决哈希冲突的方法
1 开放地址法:线性探测
线性补偿探测–》线性探测在散列
随机探测
2 拉链法(我用的)
2.哈希查找
个人体会:哈希查找快的原因其实就是将每个数据已经分类好了,不用在从头遍历到尾。只需要找到它的归属地(nIndex),然后在遍历归属地的元素即可查找元素是否存在。创建指针数组和数据入组是关键!!!为什么要创建指针数组呢?就是因为哈希表中存放的类型都是指针,因此创建指针数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int nVal;
int nIndex;
struct node *pNext;
}Hash;
Hash **CreateHashTable(int arr[],int len)
{
if(arr == NULL || len <= 0)
return NULL;
//指针数组
Hash **pHash = (Hash**)malloc(sizeof(Hash*)*len);
memset(pHash,0,sizeof(Hash*)*len);
int nIndex;
int i;
Hash *pTemp = NULL;
for(i = 0;i<len;i++)
{
nIndex = arr[i]%len;
pTemp = (Hash*)malloc(sizeof(Hash));
pTemp->nIndex = i;
pTemp->nVal = arr[i];
//头插法
pTemp->pNext = pHash[nIndex];
pHash[nIndex] = pTemp;
}
return pHash;
}
int HashSearch(Hash **pHash,int len,int num)
{
if(pHash == NULL || len <= 0)
return -1;
int nIndex;
nIndex = num%len;
Hash *pTemp = NULL;
pTemp = pHash[nIndex];
while (pTemp)
{
if(pTemp->nVal == num)
{
return pTemp->nIndex;
}
pTemp = pTemp->pNext;
}
return -1;
}
int main()
{
int arr[] = {11,22,33,43,53,52,56,76,67,87,98};
Hash **pHash = CreateHashTable(arr,sizeof(arr)/sizeof(arr[0]));
int n = HashSearch(pHash,sizeof(arr)/sizeof(arr[0]),33);
printf("%d\n",n);
return 0;
}