字符串哈希相关问题
2021/12/23 23:07:54
本文主要是介绍字符串哈希相关问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
字符串哈希相关问题
如何对一个字符串进行哈希呢?
字符串哈希公式
\[str[i]: 表示字符串第i个位置的字符 \\ P: 质数 \\ \begin{aligned} hash(str[0..n]) &= str[0] * P ^ n + str[1] * P ^ {(n - 1)} + \cdots + str[n] * P ^ 0 \\ &= hash(str[0..{n - 1}]) * P + str[n] \end{aligned} \]哈希是指☞将元素映射为一个确定的数值。
input: anything output: number
- 参考文章:https://blog.csdn.net/u012835097/article/details/79407591
哈希函数的应用场景:散列表中用于确定元素在散列表中的位置。
那么上述的哈希公式会不会问题呢?
是有的,就是当输入的元素越来越多时,难免会出现哈希碰撞。这种情况对于一些需要唯一值的场景就很搞。
那么有什么解决方法吗?
最简单的方法,就加多一个哈希函数,采用双哈希的方法,来确定唯一值。一般这种方法基本不会出现哈希碰撞。
除了哈希碰撞外,这个公式还有其他问题吗?
没错,当字符串长度大到一定程度时会溢出。
此时,可以采用取模来解决此问题。
\[hash(str[0..n]) = ((hash({n - 1}) * P\quad mod \quad N) + str[n])\quad mod \quad N \]
如何求子串的哈希值?
\[\begin{aligned} hash(str[i..j]) &= hash(str[0..j]) - hash(str[0..{i-1}]) * P ^ {(j - i + 1)} \\ &= (str[0] * P ^ j + str[1] * P ^ {(j - 1)} + \cdots + str[{i-1}] * P ^ {(j - i + 1)} + \cdots + str[j] * P ^ 0) - (str[0] * P ^ {(i - 1)} + str[1] * P ^ {(i - 2)} + \cdots + str[{i - 1}] * P ^ 0) * P ^ {(j - i + 1)} \\ &= (str[0] * P ^ j + str[1] * P ^ {(j - 1)} + \cdots + str[{i-1}] * P ^ {(j - i + 1)} + \cdots + str[j] * P ^ 0) - (str[0] * P ^ j + str[1] * P ^ {(j - 1)} + \cdots + str[{i - 1}] * P ^ {(j - i + 1)}) \\ &= str[i] * P ^ {(j - i)} + \cdots + str[j] * P ^ 0 \end{aligned} \]相关算法题:
- 重复的DNA序列
- 最长重复子串
这篇关于字符串哈希相关问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南