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

其实很简单:

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,这样的话,我就能够在哈希冲突的时候判断是不是我要找的元素。

原文地址:https://www.cnblogs.com/hackerl/p/13092402.html