哈希查找
Posted lune-qiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希查找相关的知识,希望对你有一定的参考价值。
哈希查找:按某种规则散列
建立一个哈希表 ,适用于多次查找。因为建表消耗的时间和空间比较大。
散列函数:求整取余法
例如:数组中有n个值,则对n取余。申请一个长度为n的数组。最理想的情况下,每个位置放置一个数,但不同的数可能对n取余数相同。
解决哈希冲突:
1.开放地址法:
线性探测: 有冲突则放入下一个
线性补偿探测:有冲突向后走”步长”个,放入。步长是自己规定的。但是这样可能有空的位置但是找不到
线性补偿再散列:有冲突则查看以下位置,+-1,+-4,+-9。。。n的平方
随机探测:生成一个随机数,看其位置是否有人。有人再随机一个数。
2.拉链法
数组中装的是一个链表,这样每个位置都可以放置无限多的值。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node1 { int index; int num; struct node1* pnext; }Node; Node** CreateHash(int* arr,int len) { if(arr == NULL || len == 0) return NULL; Node** HashArr = (Node**) malloc(sizeof(Node*)*len); memset(HashArr,0,sizeof(Node*)*len); for(int i = 0 ;i < len;i++) { Node* tmp = (Node*)malloc(sizeof(Node)); tmp->index = i; tmp->num = arr[i]; tmp->pnext = HashArr[arr[i]%len] ; HashArr[arr[i]%len] = tmp; } return HashArr; } int Search(Node** HashArr,int len,int val) { Node* tmp = HashArr[val%len];//? while(tmp!=NULL) { if(tmp->num == val ) return tmp->index; tmp = tmp->pnext; } return -1; } int main() { 。 。 。 。 Node *tmp; Node* pDel; for(int i = 0; i < len;i++) { tmp = HashArr[i]; while(tmp) { pDel = tmp; tmp = tmp->pnext; free(pDel); pDel = NULL; } } }
以上是关于哈希查找的主要内容,如果未能解决你的问题,请参考以下文章