• 哈希查找


    哈希查找的思想是按照某种弄规则散列(分组)

    创建哈希表,可以多次利用

    哈希查找适用于多次查找,查找速度是最快的

    散列我们一般用求整取余法

    数组长度是几我们就对几取余,存到哈希表的对应数组下标里

    但是可能会遇到哈希冲突,也就是数组里某一处已经有元素了,还要往里存

    解决哈希冲突我们一般用两种方法

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

      

  • 相关阅读:
    金斗云提醒用法说明
    金斗云提醒软件的原理
    缓存雪崩问题,缓存击穿问题,缓存一致性问题(内存+数据库)
    Spring的ApplicationEvent实现
    区块链技术--区块链的生成和链接
    区块链技术--比特币交易的锁定和解锁
    区块链技术--密码学
    区块链技术--比特币
    jedis中scan的实现
    KafkaManager对offset的两种管理方式
  • 原文地址:https://www.cnblogs.com/TheQi/p/9123152.html
Copyright © 2020-2023  润新知