哈希查找
Posted theqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希查找相关的知识,希望对你有一定的参考价值。
哈希查找的思想是按照某种弄规则散列(分组)
创建哈希表,可以多次利用
哈希查找适用于多次查找,查找速度是最快的
散列我们一般用求整取余法
数组长度是几我们就对几取余,存到哈希表的对应数组下标里
但是可能会遇到哈希冲突,也就是数组里某一处已经有元素了,还要往里存
解决哈希冲突我们一般用两种方法
1.开放地址法
1.1线性探测 有冲突就放入下一个
1.2线性补偿探测 有冲突就向后走步长个
1.3线性有偿再散列 有冲突就往±1,±4,±9,±16放
1.4随机补偿 生成随机数,如果有的话再生成
2.拉链法
代码如下
typedef struct NODE
{
int nValue;
int xb;
struct NODE* pNext;
}Node;
Node** CreateHX(int* arr,int length)
{
//创建一个指针数组
Node** ptemp = (Node**)malloc(sizeof(Node*) * length);
memset(ptemp,0,sizeof(Node*)*length);
int j;
for(int i=0;i<length;i++)
{
//求整取余
j = arr[i]%length;
Node* p = (Node*)malloc(sizeof(Node));
p->nValue = arr[i];
p->xb = i;
p->pNext = NULL;
//链表的头添加
if(ptemp[j] == NULL)
{
ptemp[j] = p;
}
else
{
p->pNext = ptemp[j];
ptemp[j] = p;
}
}
return ptemp;
}
int Search(Node** node,int* arr,int length,int num)
{
//得到余数,哈希表的下标
int j = num%length;
Node* ptemp = NULL;
if(node[j])
{
//得到链表头
ptemp = node[j];
while(ptemp != NULL)
{
if(ptemp->nValue == num)
return ptemp->xb;
ptemp = ptemp->pNext;
}
}
return -1;
}
void DeleteHX(Node** pNode,int length)
{
Node* p = NULL;
for(int i=0;i<length;i++)
{
while(pNode[i])
{
p = pNode[i];
pNode[i] = pNode[i]->pNext;
free(p);
p = NULL;
}
}
free(pNode);
}
以上是关于哈希查找的主要内容,如果未能解决你的问题,请参考以下文章