字符串hash算法有很多,為什么用這個(gè)不用其他呢,也許只是隨便挑了一個(gè)性能過得去的。如果解決了您的問題請(qǐng)采納!如果未解決請(qǐng)繼續(xù)追問
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、岑鞏網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場(chǎng)景定制、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為岑鞏等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
dict對(duì)象是Python中一個(gè)原始的數(shù)據(jù)類型,按照鍵值對(duì)的方式存儲(chǔ),中文名為字典,其通過鍵名查找對(duì)應(yīng)的值有很高的效率,時(shí)間復(fù)雜度在常數(shù)級(jí)別O(1)。Python dict的底層是依靠哈希表(Hash Table)進(jìn)行實(shí)現(xiàn)的,使用開放地址法解決沖突。所以其查找的時(shí)間復(fù)雜度會(huì)是O(1),why?
哈希表是key-value類型的數(shù)據(jù)結(jié)構(gòu),通過關(guān)鍵碼值直接進(jìn)行訪問。通過散列函數(shù)進(jìn)行鍵和數(shù)組的下標(biāo)映射從而決定該鍵值應(yīng)該放在哪個(gè)位置,哈希表可以理解為一個(gè)鍵值需要按一定規(guī)則存放的數(shù)組,而哈希函數(shù)就是這個(gè)規(guī)則。
算法中時(shí)間和空間是不能兼得的,哈希表就是一種用合理的時(shí)間消耗去減少大量空間消耗的操作,這取決于具體的功能要求。
創(chuàng)建一個(gè)數(shù)組,數(shù)組下標(biāo)是索引號(hào),數(shù)組中的值是要獲得的數(shù)據(jù),這樣只需要O(1)的時(shí)間復(fù)雜度就可以完成操作,但是擴(kuò)展性不強(qiáng),有以下兩個(gè)方面的考慮:
-1- 新添加的元素超出數(shù)組索引范圍,這就需要重新申請(qǐng)數(shù)組進(jìn)行遷移操作。
-2- 假設(shè)一種極端的情況:只存在兩個(gè)元素,索引號(hào)分別是1和100000000001,按照先前的設(shè)計(jì)思路,會(huì)浪費(fèi)很大的存儲(chǔ)空間。
會(huì)不會(huì)存在一個(gè)方法,為已有的索引創(chuàng)建新的索引,通過壓縮位數(shù),讓新索引可以和原有的大范圍的稀疏索引進(jìn)行一一對(duì)應(yīng),新索引所需要的存儲(chǔ)空間要大大減小,這就是哈希思想。
上面的例子中哈希函數(shù)的設(shè)計(jì)很隨意,但是從這個(gè)例子中我們也可以得到信息:
哈希函數(shù)就是一個(gè)映射,因此哈希函數(shù)的設(shè)定很靈活,只要使得任何關(guān)鍵字由此所得的哈希函數(shù)值都落在表長(zhǎng)允許的范圍之內(nèi)即可;
因?yàn)樾碌乃饕龑?duì)舊的索引進(jìn)行了空間上的壓縮,所以不可能所有的輸入都只對(duì)應(yīng)唯一一個(gè)輸出,也就是哈希函數(shù)式有可能發(fā)生沖突的,哈希函數(shù)不可能做成一對(duì)一的映射關(guān)系,其本質(zhì)是一個(gè)多對(duì)一的映射。
直接定址法:很容易理解,key=Value+C; 這個(gè)“C”是常量。Value+C其實(shí)就是一個(gè)簡(jiǎn)單的哈希函數(shù)。
除法取余法: 很容易理解, key=value%C;解釋同上。
數(shù)字分析法:這種蠻有意思,比如有一組value1=112233,value2=112633,value3=119033,針對(duì)這樣的數(shù)我們分析數(shù)中間兩個(gè)數(shù)比較波動(dòng),其他數(shù)不變。那么我們?nèi)ey的值就可以是key1=22,key2=26,key3=90。
平方取中法。此處忽略,見名識(shí)意。
折疊法:這種蠻有意思,比如value=135790,要求key是2位數(shù)的散列值。那么我們將value變?yōu)?3+57+90=160,然后去掉高位“1”,此時(shí)key=60,哈哈,這就是他們的哈希關(guān)系,這樣做的目的就是key與每一位value都相關(guān),來(lái)做到“散列地址”盡可能分散的目地。
當(dāng)兩個(gè)不同的數(shù)據(jù)元素的哈希值相同時(shí),就會(huì)發(fā)生沖突。解決沖突常用的手法有2種:
開放地址法:
如果兩個(gè)數(shù)據(jù)元素的哈希值相同,則在哈希表中為后插入的數(shù)據(jù)元素另外選擇一個(gè)表項(xiàng)。當(dāng)程序查找哈希表時(shí),如果沒有在第一個(gè)對(duì)應(yīng)的哈希表項(xiàng)中找到符合查找要求的數(shù)據(jù)元素,程序就會(huì)繼續(xù)往后查找,直到找到一個(gè)符合查找要求的數(shù)據(jù)元素,或者遇到一個(gè)空的表項(xiàng)。
鏈接法:
將哈希值相同的數(shù)據(jù)元素存放在一個(gè)鏈表中,在查找哈希表的過程中,當(dāng)查找到這個(gè)鏈表時(shí),必須采用線性查找方法。
python的dict采用了哈希表,最低能在 O(1)時(shí)間內(nèi)完成搜索,在發(fā)生哈希沖突的時(shí)候采用的是開放尋址法。java的HashMap也是采用了哈希表實(shí)現(xiàn),但是在發(fā)生哈希沖突的時(shí)候采用的是鏈接法。
Python中字符串是可哈希的,即可以作為字典的鍵或者HashTable的鍵使用。
您可以這樣子使用Python內(nèi)置函數(shù)hash(散列函數(shù)):
您也可以將字符串轉(zhuǎn)為一個(gè)集合:
總之,Python里面有很多內(nèi)置的hash功能性數(shù)據(jù)結(jié)構(gòu)和函數(shù)。
哈希表(Hash Table) :通過鍵 key 和一個(gè)映射函數(shù) Hash(key) 計(jì)算出對(duì)應(yīng)的值 value,把關(guān)鍵碼值映射到表中一個(gè)位置來(lái)訪問記錄,以加快查找的速度。
哈希函數(shù)(Hash Function) :將哈希表中元素的關(guān)鍵鍵值映射為元素存儲(chǔ)位置的函數(shù)。
哈希沖突(Hash Collision) :不同的關(guān)鍵字通過同一個(gè)哈希函數(shù)可能得到同一哈希地址。
哈希表的兩個(gè)核心問題是: 「哈希函數(shù)的構(gòu)建」 和 「哈希沖突的解決方法」 。
常用的哈希函數(shù)方法有:直接定址法、除留余數(shù)法、平方取中法、基數(shù)轉(zhuǎn)換法、數(shù)字分析法、折疊法、隨機(jī)數(shù)法、乘積法、點(diǎn)積法等。
常用的哈希沖突的解決方法有兩種:開放地址法和鏈地址法。
給你一個(gè)整數(shù)數(shù)組 nums 和兩個(gè)整數(shù) k 和 t 。請(qǐng)你判斷是否存在 兩個(gè)不同下標(biāo) i 和 j,使得 abs(nums[i] - nums[j]) = t ,同時(shí)又滿足 abs(i - j) = k 。
如果存在則返回 true,不存在返回 false。
給定兩個(gè)數(shù)組 nums1 和 nums2 ,返回 它們的交集 。輸出結(jié)果中的每個(gè)元素一定是 唯一 的。我們可以 不考慮輸出結(jié)果的順序 。
給你兩個(gè)整數(shù)數(shù)組 nums1 和 nums2 ,請(qǐng)你以數(shù)組形式返回兩數(shù)組的交集。返回結(jié)果中每個(gè)元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個(gè)數(shù)組中都出現(xiàn)的次數(shù)一致(如果出現(xiàn)次數(shù)不一致,則考慮取較小值)??梢圆豢紤]輸出結(jié)果的順序。
請(qǐng)你判斷一個(gè) 9 x 9 的數(shù)獨(dú)是否有效。只需要 根據(jù)以下規(guī)則 ,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。
數(shù)字 1-9 在每一行只能出現(xiàn)一次。
數(shù)字 1-9 在每一列只能出現(xiàn)一次。
數(shù)字 1-9 在每一個(gè)以粗實(shí)線分隔的 3x3 宮內(nèi)只能出現(xiàn)一次。(請(qǐng)參考示例圖)
力扣217
力扣389
力扣496
內(nèi)容參考: