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