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

恭喜你找到了这篇博客!虽然这个标题看起来非常像是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. 卸载虚拟机出现用户已存在的错误_极限 JVM (1) 虚拟机规范
  2. 《实现模式(修订版)》—第1章1.2节那么,现在……
  3. html 5 video audio
  4. 阿里资深系统架构师九峰谈云计算
  5. C# 面向对象三大特性:封装、继承、多态
  6. .net core2.0 Memcached.ClientLibrary
  7. PYQT4 Python GUI 编写与 打包.exe程序
  8. Python魔法方法(magic method)细解几个常用魔法方法(下)
  9. 我没让机器人变身,它自己就变了 | Science Robotics
  10. Gmail最新功能实测:离线版上线增加手势(多图)
  11. 【Luogu1580】yyy loves Easter_Egg I(纯字符串模拟)
  12. java循环队列_Java版-数据结构-队列(循环队列)
  13. 在windows系统下安装linux双系统
  14. 计算机通信发展史,通信技术发展史
  15. 经典软件架构设计模式
  16. 操作系统 实时调度
  17. java时间戳转换_Java编程实现时间和时间戳相互转换实例
  18. oracle.-904,ORACLE 11G ORA-904 while running select query(BUG)
  19. 微信公众号开通流量主
  20. SqlHelper类的使用

热门文章

  1. 教育教学知识与能力小学计算机,浅谈小学计算机教学论文
  2. 面向数智营销的 AI FAAS 解决方案
  3. indesign2020突然闪退_Adobe Photoshop 2020打不开,总是闪退,罪魁祸首在这里
  4. 读书笔记——《迁移到云原生架构》
  5. Linux sse 地址对齐指令,SSE指令:哪些CPU可以执行原子16B内存操作?
  6. mysql将查到的数据删除_MySQL数据库的基本操作——增、删、改、查
  7. 【计算机组成原理】多功能算数逻辑运算单元
  8. gis中开始编辑之后显示空间参考_空间参考—帮助 | ArcGIS Desktop
  9. 如何设计一个高并发系统
  10. [机器学习] 面试常见问题+解析汇总