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

9ec044cec04b2016e18dd799334886bf.png

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

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

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

9e2076b788502f199996785866370255.png

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

149cfca9ce8ca84838d98cfcfa436d0b.png

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

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

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

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

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

711b03f3d5909d93ef1c6ed1d6d1cec4.png

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

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

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

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

26aa7cc359f26209e80514a7bf7b96c8.png

f2865667b699ed7b4b05e75a98575985.png

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

从前有这样一种东西,它的每一位都不超过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 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

岗位理解_当面试官问求职者对应聘岗位的理解情况

虽然求职是看的是岗责是否匹配自己的经历和能力,但是很多面试官还是会问这样的问题。对于求职者来说,对岗位的理解其实就是把岗位职责背一遍,但是面试官既然问了,就要说出一些其他内容来。想回答好这个问题,就要清楚面…

指针和引用的区别_浅析指针与引用

关注“杜明c”,每天进步一点点!已经时隔一个多月没有发文章了,主要是太忙了,绝不是偷懒今天给大家聊一聊指针和引用的不同之处在哪里。摘要指针的使用引用的使用二者的区别后话指针的使用在C语言中,我们怎么样在子函数…

运行catia_教程 | CATIA宏的录制及应用

首先和大家聊一聊宏。宏,英文Macro,是很多软件中都带有的功能,能够将一系列操作的过程录制下来,即将若干命令集合为一个命令,无论是CATIA还是Office软件,甚至很多游戏也有宏功能。用户基于录制的宏进行适当…

arccatalog点要素显示不完_如果你读不完显示屏说明书,至少读完这几句话吧

如果说起LED显示屏现在能够被那么多人熟知的原因,常规全彩LED显示屏绝对是不可或缺的基础,常规全彩屏有两大分类分别是户外全彩LED显示屏和室内全彩LED显示屏,这个很多人也都知道,但你知道它们的区别在哪吗?让我们力诺…

css 模拟器方向_GDS变方向动态循环单剪实验系统VDDCSS

原标题:GDS变方向动态循环单剪实验系统VDDCSS变方向循环简单剪切(VDDCSS)允许在两个方向进行简单剪切,而不是标准单向。这通过具有作用于其上的次级剪切作动器来实现,此剪切作动器与主剪切作动器相差90度排布。当用作可变方向的机器时&#x…

antd table动态表头_解决react使用antd table组件固定表头后,表头和表体列不对齐以及配置fixed固定左右侧后行高度不对齐...

1、固定表头后表体列和表头不对齐此问题可能在antd3.24.0版本以前都存在,反正3.16.2版本是存在这个问题的,若是是3.24.0以前的版本估计只能经过修改css样式解决。css按照官网说的:react一、若列头与内容不对齐或出现列重复,请指定…

vue通过class获取dom_.NET Core通过Json或直接获取图形验证码(务必收藏备用)

(给DotNet加星标,提升.Net技能)转自:殷慈航cnblogs.com/jiyuwu/p/11803979.html很多人写的博客大家看了会一知半解,不知道怎么用,应该引用什么类库或者代码不全,这样很多小白很是头疼,尤其是尝新技术更是如…

c++ 动态分配数组_C/C++编程笔记:「C语言指针」民间解读版本

相信很多同学在初学C语言时候,都会遇到遇到一个问题:指针,永远的神!好消息,这个痛点将会在这篇文章得到解决,妈妈再也不用担心我的学习了!一说指针,第一反应,指针是一种数…

安卓menu页面跳转_微信安卓版7.0.14内测!“发现小程序”页面大改版

除了安卓用户心心念念的“群备注”,“发现-小程序”面板也有大变动~话不多说,赶紧下载内测版体验新功能(后台回复【7014】,即可获取内测版下载链接)群备注:虽迟但到此前iOS版微信率先上线的新功能,这次在安卓内测版中也…

css before after用法_CSS 伪元素基础知识:content 与counter 实用技巧(二)

在CSS 伪元素基础知识:before 与after (一),笔者已经介绍过 CSS 里的::before 和::after 这两个伪元素,以及content 相关的用法,这篇将针对content 搭配counter (计数器) 进行一些有趣的应用,相信熟练之后搞不好能做出…

c语言怎么让写的函数兼容int型和char型_既然C语言void指针是“万能指针”,那么malloc还需类型转换吗?...

在C语言程序开发中,动态内存分配是不可避免的,而调用 malloc()/free() 库函数实现这一过程是方便的,事实上,在很多C语言程序中,malloc/free 库函数的使用相当频繁,它俩的C语言函数原型如下,请看…

mysql datetime最小值_MySQL的5种时间类型的比较

日期时间类型占用空间日期格式最小值最大值零值表示DATETIME8 bytesYYYY-MM-DD HH:MM:SS1000-01-01 00:00:009999-12-31 23:59:590000-00-00 00:00:00TIMESTAMP4 bytesYYYY-MM-DD HH:MM:SS197001010800012038 年的某个时刻00000000000000DATE4 bytesYYYY-MM-DD1000-01-019999-1…

Mysql数据库的简单备份与还原_史上最简单的MySQL数据备份与还原教程

本文主要为大家详细介绍了史上最简单的MySQL数据备份与还原教程第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。数据备份与还原第一篇分享给大家,具体内容如下基础概念:备份,将…

mysql数据库云读取_云数据库 MySQL版

{"moduleinfo":{"banner_bigTit":"云数据库 MySQL版读写分离上线","banner_subTit":"自动扩展读写分离,性能提升不止一点","banner_link":"https://rdsnew.console.aliyun.com/console/index#/rd…

mysql查询并设置高亮_慢查询分析调优工具~mysqldumpslow

在日常的业务开发中,MySQL出现慢查询是很常见的,要么说明你家产品的增长性很好,要么就是你的SQL写的太烂了。所以对慢查询SQL进行分析和优化很重要,其中mysqldumpslow是MySQL服务自带的一款很好的分析调优工具。MySQL慢查询日志My…

非法的表达式开始_轮回、开始还是结束?

上节课说到&#xff0c;要打印0-9这十个数字&#xff0c;除了一个一个的 document.write 还有什么办法?下面介绍一个for语法for (var 变量 初始值; 结束判断表达式; 变量递增/递减) { 循环体&#xff0c;用于处理变量;}我们来实操一下for (var c0;c<9;cc1) { do…

sql 统计记录条数后 打印出所有记录_用SQL完成购买行为分析(下篇II)

&#xff08;接《用SQL完成购买行为分析&#xff08;下篇I&#xff09;》内容&#xff09;12&#xff09;查询首条记录为fav&#xff0c;总记录条数为14的记录。将前面getNum(3)红框处替换为12&#xff0c;运行getNum(14)得到第2条记录的数量&#xff1a;替换为11&#xff0c;得…

library的英语怎么读音_library怎么读声音

library的英式读音和美式读音均为&#xff1a;[ˈlaɪbrəri]。library可作名词&#xff0c;其作名词时&#xff0c;中文意思有&#xff1a;图书馆&#xff1b;藏书楼&#xff1b;图书室&#xff1b;资料室&#xff1b;(书、激光唱片等的)个人收藏等含义。一、library 读音英式…

sift线特征提取代码_车道线检测LaneNet

LanNetSegmentation branch完成语义分割,即判断出像素属于车道or背景Embedding branch完成像素的向量表示,用于后续聚类,以完成实例分割H-NetSegmentation branch解决样本分布不均衡车道线像素远小于背景像素.loss函数的设计对不同像素赋给不同权重,降低背景权重.该分支的输出为…

mysql ehcache_MyBatis使用Ehcache作为二级缓存

特别说明&#xff1a;由于二级缓存是基于Mapper的&#xff0c;当你在不同的mapper中查询了相同的数据&#xff0c;例如不同的Mapper中有多表查询时结果中有相同的数据&#xff0c;当其中一个Mapper进行插入更新缓存时&#xff0c;另一个并没有插入更新&#xff0c;那么使用两个…