zoukankan      html  css  js  c++  java
  • 哈希函数

    参考学习原文:https://blog.csdn.net/u012835097/article/details/79407591,本文只是本人学习记录!!!

    1.存储时先使用哈希函数计算,然后把它们存入对应的位置,查找的时候,要先使用哈希函数计算它的位置,然后去那个位置查看是否存在就好了。

    哈希 其实是随机存储的一种优化,先进行分类,然后查找时按照这个对象的分类去找。

    哈希通过一次计算大幅度缩小查找范围,自然比从全部数据里查找速度要快。

    哈希的过程需要哈希函数进行计算,哈希函数是一种映射关系。

    adr = Hash(key)

    几种常见的哈希函数构造方法

    1.直接定址法

    • 取关键字或关键字的某个线性函数值为散列地址。
    • 即 H(key) = key 或 H(key) = a*key + b,其中a和b为常数。

    2.除留余数法

    • 取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。
    • 即 H(key) = key % p, p < m。 

    3.数字分析法

    • 当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列地址。
    • 仅适用于所有关键字都已知的情况下,根据实际应用确定要选取的部分,尽量避免发生冲突。

          

    4.平方取中法

    • 先计算出关键字值的平方,然后取平方值中间几位作为散列地址。
    • 随机分布的关键字,得到的散列地址也是随机分布的。

        

    5.折叠法(叠加法)

    • 将关键字分为位数相同的几部分,然后取这几部分的叠加和(舍去进位)作为散列地址。
    • 用于关键字位数较多,并且关键字中每一位上数字分布大致均匀。 

       

    6.随机数法

    • 选择一个随机函数,把关键字的随机函数值作为它的哈希值。
    • 通常当关键字的长度不等时用这种方法。 

    构造哈希函数的方法很多,实际工作中要根据不同的情况选择合适的方法,总的原则是尽可能少的产生冲突。

    通常考虑的因素关键字的长度分布情况哈希值的范围等。

    如:当关键字是整数类型时就可以用除留余数法;如果关键字是小数类型,选择随机数法会比较好。

    哈希的应用

    • 哈希表
    • 分布式缓存
  • 相关阅读:
    CSP-S2-2019游记
    【BZOJ2301】【HAOI2011】Problem B
    【NOIp2017】宝藏
    【NOIp2016】天天爱跑步
    【NOIp2018】保卫王国
    【BZOJ2159】Crash的文明世界
    Van爆零赛总结
    【ZJOI2016】小星星
    【CF1025D】Recovering BST
    【HAOI2016】字符合并
  • 原文地址:https://www.cnblogs.com/Janejxt/p/14714175.html
Copyright © 2011-2022 走看看