• 闲来无事 想到的哈希冲突了 解决方案


    其实很简单:

    1、大前提是选择哈希结果平均分布的哈希函数,这个有很多种方案,不是关键;

    2、在存储哈希结果的时候,

      2.1、如果当前地址没有被占用,则直接存放值;

      2.2、如果当前地址已经被占用了:

        2.2.1、如果当前地址存放的是一个值:则在该地址存放指针,该指针指向一个链表,同时需要将原来这个位置的值放入链表,新的值也加入链表;

        2.2.2、如果当前地址存放的是一个指针:直接在这个指针所指的链表里面加入新的值节点即可;

    ps:上面所说的值 是一个 结构体对象,这个结构体对象里面即有key又有hash(key)和value,以下简称值;

    3、这样的话:当查找的时候通过将key传入hash函数的时候,得到哈希之后的hashkey:

      3.1、如果hashkey这个地址里面存储的是一个值,那么说明这个位置没有哈希冲突,直接取出值返回即可;

      3.2、如果hashkey这个地址里面存储的是一个指针,那么说明这个key有哈希冲突,所以就按照有哈希冲突的方法来处理:

        3.2.1、先找到这个指针对应的链表,然后挨个遍历链表,查看每一个元素,查看该元素的key是否和我所传入的key相同:

          3.2.1.1、如果相同则说明是我要找的那个值,查找成功;

          3.2.1.2、如果不同则继续往后找,直到找到链表最后都没有我当前的key的话,则整个查找失败。

    总结:

    1、哈希冲突不可避免;

    2、怎么在冲突的时候还能知道是不是我要找的元素;

    这里最重要的是数据结构的时候,在存储的时候同时存上value 和key,这样的话,我就能够在哈希冲突的时候判断是不是我要找的元素。

  • 相关阅读:
    C/C++预处理指令#define,#ifdef,#ifndef,#endif…
    解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
    Elasticsearch Aggregation 多个字段分组统计 Java API实现
    [转]Elasticsearch Java API总汇
    ElasticSearch Aggs的一些使用方法
    ElasticSearch 简单入门
    jQuery表格自动增加
    JVM(Java虚拟机)优化大全和案例实战
    Tomcat性能调优-让小猫飞奔
    Mapreduce部署与第三方依赖包管理
  • 原文地址:https://www.cnblogs.com/hackerl/p/13092402.html
Copyright © 2020-2023  润新知