大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧!

恭喜你找到了这篇博客!虽然这个标题看起来非常像是nc营销号的标题但是!请相信我一次这是真的!如果不行请随时取关!(等等你好像还没关注我那不如现在先关注看完再取关吧哈哈

好了不跟你多BB,想象你现在有一堆数,你要把他们装进一堆桶里,相同的数放在一起,你会怎么做呢?

哦这太简单了!只要在每个桶上面标上这个数,然后把数丢进相应的桶不就完了?

(咦?怎么有个桶看起来就很蠢的样子)

那我们在程序上怎么实现这个桶呢?

啊答主你是没学过数组还是怎么的!直接开一个a[1000],假设来了一个数x,就让a[x]自加1不就行了!

好啊!但你这有个小问题。要是来一个9999怎么办?开a[10000]?

那要是来99999呢?987654321呢?或者更直接,来个字符串呢?

难道要开字符串为下标的数组?这怎么可能呢。

字符串到整数的唯一映射——字符串哈希

让我们想想问题出在哪。下标必须是一个不太大的正整数,也就是说,我们要将一个字符串变成一个不太大的正整数

首先我们将每个字符看做等于他的ASCII码的整数,这样字符串就变成了一个数串,且每个数不超过127(只有字母和数字的话ASCII是不超过127的)。

现在我们就来突发奇想啦!怎么才能用一个数表示这个数组呢?

从前有这样一种东西,它的每一位都不超过127,也就是说不到128……

啊!这不就是一个128进制的数吗!

从左到右,分别代表了这个128进制数的从高位到低位……

然而我们现在知道的是这个数的每一位,要得到这个数是很简单的。

比如[100,55]这个数有两位,

那么这个数的值就是100×128+55=12855

有三位的话,如[127,100,55],

那就是127×(128^2)+100×128+55=2093623

那么我们只需要提前处理出128的若干次方,然后分别与这个数的每一位相乘,就能得到这个数了!

完美!

等等,128的5次方不就超出int范围了吗?

超就超!

要知道我们实际上要建立的是一个单射关系,即只要能通过一个字符串推出一个唯一确定的数,我们的目的就达到了。

我其实是求出了这个128进制数的值的,只是最后将它映射到了int范围里的数。

这时聪明的读者说:你这样损失了信息,万一两个128进制数本来不同,这么一搞给你搞成相同的了那不完犊子了?

考虑到这个数已经很大了,将它mod一下int范围,其实已经相当于int范围内的随机数了,只是这个数是由字符串唯一确定的。

既然是随机数,那不同的字符串映射到相同数的概率,就跟在0~2147483647里随机取两个数,它们相等的概率一样了。

在实际中,我们可以认为这个概率就是0。

完美!!!

当然,现在这个数的范围是0~2147483647。如果想要继续缩小范围,那么可以再mod一个随便什么数,原理同上。

当然你mod的数也不能太小。具体如果你取N,那么平均情况下在计算到第1.17*√N个字符串时有50%的概率会重复(证明可搜“生日攻击”)。所以建议在不超过限度的情况下尽量取大。

int 

喜欢的话就支持一下啦,想笔者出什么文章或者有什么建议也可以在评论区说☆

怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程相关推荐

  1. java 字符串 字节数组_字符串到字节数组,字节数组到Java中的字符串

    java 字符串 字节数组 Today we will learn how to convert String to byte array in java. We will also learn ho ...

  2. java字符数组转化为字符串_java字符数组转字符串,java数组转字符串

    字符串转数组 使用Java split() 方法 split() 方法根据匹配给定的正则表达式来拆分字符串. 注意: . . | 和 * 等转义字符,必须得加 \\.多个分隔符,可以用 | 作为连字符 ...

  3. java字符数组转字符串,java数组转字符串

    字符串转数组 使用Java split() 方法 split() 方法根据匹配给定的正则表达式来拆分字符串. 注意:..|和*等转义字符,必须得加\.多个分隔符,可以用|作为连字符. // 字符串转数 ...

  4. python十分钟教程_简洁的十分钟Python入门教程

    [简介] Python是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语 ...

  5. scala 字符串转换数组_如何在Scala中将字节数组转换为字符串?

    scala 字符串转换数组 Byte Array in Scala is an array of elements of a byte type. String in Scala is a colle ...

  6. lua字符串转数组_深入Lua:字符串管理

    Lua的字符串对象表示为下面结构: typedef struct TString {CommonHeader;// 字符串的子类型有两种:长字符串和短字符串// 短字符串:extra表示Lua保留字的 ...

  7. scala 字符串转换数组_如何在Scala中将十六进制字符串转换为字节数组?

    scala 字符串转换数组 Hex String in Scala denotes value in hexadecimal number system i.e. base 16 number sys ...

  8. cmake字符串转数组_掌握常用的数据结构之数组和字符串

    点击上方蓝字设为星标 每周一.三.五上午 8:30 准时推送 下面开始今天的学习- 数组和字符串 所谓数组,是有序的元素序列.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量.用 ...

  9. JS_06_数组_字符串_正则_常见对象

    JavaScript 对象 JavaScript 中的所有事物都是对象:字符串.(数值).数组.函数... 此外,JavaScript 允许自定义对象. 所有事物都是对象 JavaScript 提供多 ...

最新文章

  1. 最新:2022校友会中国大学排名发布!
  2. 图片滤镜算法原理简单讲解
  3. sentinel 官方文档_SpringCloud网关聚合Swagger接口文档实践
  4. 【luogu 2709 / BZOJ 3781】小B的询问
  5. eslint 无法格式化ts_vscode保存代码,自动按照eslint规范格式化代码设置
  6. 数据库和python的结合_redis数据库及与python交互用法简单示例
  7. UVA455 Periodic Strings【水题】
  8. 软件著作权申请文档模版
  9. Eclipse安装SVN插件的方法
  10. ArcGis批量裁剪栅格图层
  11. 总所周知, p站是一个聚集了众多各国优秀艺术家相互交流的网站,Python采集p站数据
  12. 强化学习入门: the 10-armed bandit problem,e-greedy 算法
  13. matlab实现调整图片的饱和度
  14. 【在华为做OD的日子】初出茅庐
  15. You do not have sufficient permissions to access the inventory ‘/u01/app/oraInventory‘.
  16. 今天一不小心,把抖爸爸给爬了
  17. 老款诺基亚6 android 8,行动迅速!诺基亚为Nokia 6/7推送安卓8.0
  18. 含论文+辩论PPT+源码等]微信小程序ssm社区心理健康服务平台+后台管理系统
  19. HTML学习笔记——主体标题
  20. 网页中如何将文字和图片垂直居中

热门文章

  1. 面向对象分析方法(Object-Oriented Analysis,OOA)
  2. linux7 无法连接网络,CentOS7无法连接网络怎么办
  3. php 标点符号反转,PHP删除标点符号(无破折号)
  4. c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法
  5. 如何用php编写注册表格,发布PHP-MySQL注册表格
  6. android里面这个动画不动了,android,AnimationDrawable 在ListView里不动的分析及解决办法。...
  7. u大侠pe系统桌面计算机,替换WinPE桌面背景的详细教程
  8. 张陈斌计算机控制工程,计算机控制讲稿--4.pdf
  9. [蓝桥杯][2017年第八届真题]拉马车(String)
  10. 福建职称计算机评聘任,职称聘任工作的有关补充规定(试行)