哈希查找

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;
        }
    }
}

 

以上是关于哈希查找的主要内容,如果未能解决你的问题,请参考以下文章

URL片段的最大长度(哈希)

URL的PHP​​和哈希/片段部分

JavaScript笔试题(js高级代码片段)

从 URL 获取片段(哈希“#”后的值)[关闭]

带有哈希片段的锚未导航到匹配的 id

查找:哈希表