哈希查找
对无序数据,进行重复查找
基本思想
散列查找 散列即分组,按照某一特征进行查找,按照某种特征处理好——建立哈希表
- 创建哈希比表
- 确顶哈希散列函数(创建之前确定)——求整取余法 p = key%M (M <= n ) 有M组
- 定解决哈希冲突的办
a. 开放地址法(线性探测(+1)、线性补偿探测(定间隔)->线性探测在散列(间隔改变 + - i * i) 、随机探测)——去其他位置探测存储
b. 拉链法——发生冲突就生成链表
- 基于哈希表进行查找——利用指针数组
实现 - 定义结构体
- 申请请空间
- 元素入表 找到链表 链表元素添加(头添加)
- 元素查找
代码
typedef struct Date
{
int arrIndex;
int nValues;
struct Date * pNext;
}HashList;
void HashInsert(HashList ** list,int nValue,int arrID)
{
HashList * Node = (HashList *)malloc(sizeof(HashList));
Node->nValues = nValue;
Node->pNext = (*list);
Node->arrIndex =arrID;
(*list) = Node;
}
HashList ** CrateHashList(int arr[],int nlength)
{
//哈希函数 n%10;
//创建哈希表
HashList ** parrHashList = (HashList **)malloc(sizeof(HashList*)*10);
int i;
for(i = 0 ; i < 10 ; i ++ )
{
parrHashList[i] = NULL;
}
for(i = 0 ; i < nlength ; i++)
{
// 放入表中
HashInsert(&(parrHashList[arr[i]%10]),arr[i],i);
}
return parrHashList;
}
int HashSearch(HashList ** List , int nlength , int nValue )
{
HashList * list = List[nValue%nlength];
while(list != NULL)
{
if(list->nValues == nValue)
{
return list->arrIndex;
}
list = list->pNext;
}
return -1;
}