哈希查找

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

 

 

 

 

 

 

  

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

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

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

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

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

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

查找:哈希表