哈希查找

哈希查找:按某种规则散列

 按照某一规则,将分布范围比较大比较广的数据散列或者说映射到某一固定的范围内 

建立一个哈希表 ,适用于多次查找。因为建表消耗的时间和空间比较大。

散列函数:求整取余法

例如:数组中有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;
        }
    }
}
原文地址:https://www.cnblogs.com/Lune-Qiu/p/9118866.html