怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程
大家吼啊!這是我下定決心寫專欄以來的第二篇文章,請大家多多資瓷!!同樣我們先以上次的話起頭吧!
恭喜你找到了這篇博客!雖然這個標題看起來非常像是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 月 26 日举办新一
- 下一篇: 指针和引用的区别_浅析指针与引用