怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程
大家吼啊!這是我下定決心寫專欄以來的第二篇文章,請(qǐng)大家多多資瓷!!同樣我們先以上次的話起頭吧!
恭喜你找到了這篇博客!雖然這個(gè)標(biāo)題看起來非常像是nc營(yíng)銷號(hào)的標(biāo)題但是!請(qǐng)相信我一次這是真的!如果不行請(qǐng)隨時(shí)取關(guān)!(等等你好像還沒關(guān)注我那不如現(xiàn)在先關(guān)注看完再取關(guān)吧哈哈好了不跟你多BB,想象你現(xiàn)在有一堆數(shù),你要把他們裝進(jìn)一堆桶里,相同的數(shù)放在一起,你會(huì)怎么做呢?
哦這太簡(jiǎn)單了!只要在每個(gè)桶上面標(biāo)上這個(gè)數(shù),然后把數(shù)丟進(jìn)相應(yīng)的桶不就完了?
(咦?怎么有個(gè)桶看起來就很蠢的樣子)
那我們?cè)诔绦蛏显趺磳?shí)現(xiàn)這個(gè)桶呢?
啊答主你是沒學(xué)過數(shù)組還是怎么的!直接開一個(gè)a[1000],假設(shè)來了一個(gè)數(shù)x,就讓a[x]自加1不就行了!
好啊!但你這有個(gè)小問題。要是來一個(gè)9999怎么辦?開a[10000]?
那要是來99999呢?987654321呢?或者更直接,來個(gè)字符串呢?
難道要開字符串為下標(biāo)的數(shù)組?這怎么可能呢。
字符串到整數(shù)的唯一映射——字符串哈希
讓我們想想問題出在哪。下標(biāo)必須是一個(gè)不太大的正整數(shù),也就是說,我們要將一個(gè)字符串變成一個(gè)不太大的正整數(shù)。
首先我們將每個(gè)字符看做等于他的ASCII碼的整數(shù),這樣字符串就變成了一個(gè)數(shù)串,且每個(gè)數(shù)不超過127(只有字母和數(shù)字的話ASCII是不超過127的)。
現(xiàn)在我們就來突發(fā)奇想啦!怎么才能用一個(gè)數(shù)表示這個(gè)數(shù)組呢?
從前有這樣一種東西,它的每一位都不超過127,也就是說不到128……
啊!這不就是一個(gè)128進(jìn)制的數(shù)嗎!
從左到右,分別代表了這個(gè)128進(jìn)制數(shù)的從高位到低位……
然而我們現(xiàn)在知道的是這個(gè)數(shù)的每一位,要得到這個(gè)數(shù)是很簡(jiǎn)單的。
比如[100,55]這個(gè)數(shù)有兩位,
那么這個(gè)數(shù)的值就是100×128+55=12855
有三位的話,如[127,100,55],
那就是127×(128^2)+100×128+55=2093623
那么我們只需要提前處理出128的若干次方,然后分別與這個(gè)數(shù)的每一位相乘,就能得到這個(gè)數(shù)了!
完美!
等等,128的5次方不就超出int范圍了嗎?
超就超!
要知道我們實(shí)際上要建立的是一個(gè)單射關(guān)系,即只要能通過一個(gè)字符串推出一個(gè)唯一確定的數(shù),我們的目的就達(dá)到了。
我其實(shí)是求出了這個(gè)128進(jìn)制數(shù)的值的,只是最后將它映射到了int范圍里的數(shù)。
這時(shí)聰明的讀者說:你這樣損失了信息,萬一兩個(gè)128進(jìn)制數(shù)本來不同,這么一搞給你搞成相同的了那不完?duì)僮恿?#xff1f;
考慮到這個(gè)數(shù)已經(jīng)很大了,將它mod一下int范圍,其實(shí)已經(jīng)相當(dāng)于int范圍內(nèi)的隨機(jī)數(shù)了,只是這個(gè)數(shù)是由字符串唯一確定的。
既然是隨機(jī)數(shù),那不同的字符串映射到相同數(shù)的概率,就跟在0~2147483647里隨機(jī)取兩個(gè)數(shù),它們相等的概率一樣了。
在實(shí)際中,我們可以認(rèn)為這個(gè)概率就是0。
完美!!!
當(dāng)然,現(xiàn)在這個(gè)數(shù)的范圍是0~2147483647。如果想要繼續(xù)縮小范圍,那么可以再mod一個(gè)隨便什么數(shù),原理同上。
當(dāng)然你mod的數(shù)也不能太小。具體如果你取N,那么平均情況下在計(jì)算到第1.17*√N(yùn)個(gè)字符串時(shí)有50%的概率會(huì)重復(fù)(證明可搜“生日攻擊”)。所以建議在不超過限度的情況下盡量取大。
int喜歡的話就支持一下啦,想筆者出什么文章或者有什么建議也可以在評(píng)論區(qū)說☆
總結(jié)
以上是生活随笔為你收集整理的怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称微软将于 1 月 26 日举办新一
- 下一篇: 指针和引用的区别_浅析指针与引用