zoukankan      html  css  js  c++  java
  • 闲来无事 想到的哈希冲突了 解决方案

    其实很简单:

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

  • 相关阅读:
    问题 K: 找点
    问题 B: 喷水装置(二)(在c++上运行有错误,提交AC了)
    问题 A: 喷水装置(一)
    问题 Q: 最大的数
    问题 O: 寻找最大数(三)
    96.n-1位数
    问题 K: A/B Problem
    问题 D: 某种序列
    被限制的加法
    1031苹果分级
  • 原文地址:https://www.cnblogs.com/hackerl/p/13092402.html
Copyright © 2011-2022 走看看