• hash


    (卑微至极...现在才会hash可真是可笑)

    一、引入

    哈希算法是通过一个哈希函数H,将一种数据(包括字符串、较大的数等)转化为能够用变量表示或是直接就可作为数组下标的数

    通过哈希函数转化得到的数值为哈希值

    通过哈希值可以实现快速查找和匹配

    哈希算法主要有两种具体应用:字符串哈希 和 哈希表

    二、字符串hash

    1.概况

    主要解决以下问题:

      字符串匹配问题:寻找长度为n的主串S中的匹配串T(长度为m)出现的位置或次数的问题

    做法:

      通过比较长度为m的主串s的自串的哈希值y与T的哈希值是否相同

      将字符串转化为可以用变量表示的数据

    注:大多数字符串hash问题可以用KMP求解,但如果是从主串中每次选出两个子串判断是否匹配的问题,还是要用字符串hash求解

    2.具体流程

    滚动哈希:选取两个合适的互质常熟b和h(b<h),假设字符串C=c1c2...cm

    那么我们定义哈希函数:H(C) = (c1bm-1+c2bm-2+...+cmb0)mod h

    正常的数字是十进制的,这里b是基数,相当于吧字符串看作是b进制数

    这一过程是地推计算的

    设H(C,k)为前k个字符构成的字符串的哈希值,则

    H(C,k) = H(C,k - 1) * b + ck

    如果判断主串的k+1的位置开始的长度为n的子串

    H(C') = H(C , k + n) - H(C , k) * bn

    于是只要先预处理bn,就能在O(1)时间内得到任意字符串的子串的韩细致

    那么上述字符串匹配问题的算法时间复杂度就为O(n + m)

    在实际算法中,可以利用32位或64位无符号整数计算哈希值,并取h = 232或h = 264

    通过自然溢出省去求模运算

    3.字符串的hash的正确性

      可以用双哈希降低出现相同哈希值的概率,即去不同的模数

      如:h = 1e9 + 7 和 h = 1e9 + 9 (一对孪生质数)

  • 相关阅读:
    C# 读取本地图片 转存到其他盘符
    Sql server之路 (六)上传服务器图片
    wp8 ListPicker
    Sql server之路 (五)插入多条数据
    Wcf for wp8 调试Wcf服务程序(四)
    win8 鼠标失灵解决办法
    Sql server之路 (一)基础学习
    Caché开发环境介绍
    Cache数据库简介
    MYSQL之sql优化——慢查询日志
  • 原文地址:https://www.cnblogs.com/darlingroot/p/11266948.html
Copyright © 2020-2023  润新知