日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家吼啊!這是我下定決心寫專欄以來的第二篇文章,請大家多多資瓷!!同樣我們先以上次的話起頭吧!

恭喜你找到了這篇博客!雖然這個標題看起來非常像是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

喜歡的話就支持一下啦,想筆者出什么文章或者有什么建議也可以在評論區說☆

總結

以上是生活随笔為你收集整理的怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。