當前位置:首頁 » 操作系統 » 雙散列演算法

雙散列演算法

發布時間: 2022-06-18 12:17:18

『壹』 哈希函數的哈希表的概念及作用

哈希表中元素是由哈希函數確定的。將數據元素的關鍵字K作為自變數,通過一定的函數關系(稱為哈希函數),計算出的值,即為該元素的存儲地址。表示為:
Addr = H(key)
為此在建立一個哈希表之前需要解決兩個主要問題:
⑴構造一個合適的哈希函數
均勻性 H(key)的值均勻分布在哈希表中;
簡單以提高地址計算的速度
⑵沖突的處理
沖突:在哈希表中,不同的關鍵字值對應到同一個存儲位置的現象。即關鍵字K1≠K2,但H(K1)= H(K2)。均勻的哈希函數可以減少沖突,但不能避免沖突。發生沖突後,必須解決;也即必須尋找下一個可用地址。
解決沖突的方法:
⑴鏈接法(拉鏈法)。將具有同一散列地址的記錄存儲在一條線性鏈表中。例,除留余數法中,設關鍵字為 (18,14,01,68,27,55,79),除數為13。散列地址為 (5,1,1,3,1,3,1),哈希散列表如圖。
⑵開放定址法。如果h(k)已經被佔用,按如下序列探查:(h(k)+p⑴)%TSize,(h(k)+p⑵)%TSize,…,(h(k)+p(i))%TSize,…
其中,h(k)為哈希函數,TSize為哈希表長,p(i)為探查函數。在 h(k)+p(i-1))%TSize的基礎上,若發現沖突,則使用增量 p(i) 進行新的探測,直至無沖突出現為止。其中,根據探查函數p(i)的不同,開放定址法又分為線性探查法(p(i) = i : 1,2,3,…),二次探查法(p(i)=(-1)^(i-1)*((i+1)/2)^2,探查序列依次為:1, -1,4, -4, 9 …),隨機探查法(p(i): 隨機數),雙散列函數法(雙散列函數h(key) ,hp (key)若h(key)出現沖突,則再使用hp (key)求取散列地址。探查序列為:h(k),h(k)+ hp(k),…,h(k)+ i*hp(k))。
⑶桶定址法。桶:一片足夠大的存儲空間。桶定址:為表中的每個地址關聯一個桶。如果桶已經滿了,可以使用開放定址法來處理。例如,插入A5,A2,A3,B5,A9,B2,B9,C2,採用線性探查法解決沖突。如圖。

『貳』 什麼是散列法

散列法是把字元串映射到整數的處理,
通常是到一個相對小的范圍。一個
「散列函數」
映射一個字元串
(或其它的數據結構)
到一個有界的數字
(散列存貯桶),這個數字可以更容易的用於數組的索引或者進行反復的比較。明顯的,
一個從潛在的有很多組的字元串到小范圍整數的映射不是唯一的。任何使用散列的演算法都要處理
「沖突」
的可能。有許多散列函數和相關的演算法被開發了出來;
一個全面的說明已經超出了本文的范圍。

『叄』 散列演算法可以做哪些事

查找並判斷狀態是否出現過,出現過幾次
比如說一個物品a有四個特徵,為a[1],a[2],a[3],a[4]
那麼令f(a)=a[1]*(p^1)+a[2]*(p^2)+a[3]*(p^3)+a[4]*(p^4)
hash[f(a)]=a;
若又有一個物品b,特徵b[1],b[2],b[3],b[4]
f(b)=b[1]*(p^1)+b[2]*(p^2)+b[3]*(p^3)+b[4]*(p^4)
那麼a=b時,f(a)=f(b)
反過來f(a)=f(b)時,a很有可能等於b (只要p設定的足夠大,a不等於b的幾率也很小)
為了節省內存,我們可以讓f(a)=f(a)%q;
這樣hash數組只需要開q的大小
就算在mod了之後a不等於b的概率也是非常小的(所以出題人一般不怎麼能卡Hash,反而還天天考Hash)
像這樣一個題:
有n個圖,每個圖都有m個點,有一些帶權的邊,詢問每個圖中的u點能否都不經過權值小於w的邊到達v點(n*m<=200000,邊數<=300000)
首先,你可以dfs,O(n*m)可以過,
但是如果改成q<=200000次詢問,你就不能dfs了
實際上對於一個詢問,當權值大於等於w的邊全部放完之後就轉化為判斷此時uv是否都聯通,
所以我們考慮離線,將詢問按w從大到小,邊也是按權值從大到小,邊放邊,邊判斷聯通,
動態判斷聯通可以用並查集的按大小啟發式合並,id[i][k]表示在第i個圖中k所在並查集的頭,
i圖中u,v聯通等價於id[i][u]==id[i][v](表示第i個圖,需要枚舉n次)。所以可以枚舉i判斷是不是都聯通,總復雜度=O(邊數 * log2(n*m) +邊數 * n)log2(n*m)為啟發式合並的時間復雜度。最後一個n為枚舉i的耗費,如果n>500這方法就炸了,想辦法優化,這時候就可以用哈希。
設f(u)=id[1][u]*(p^1)+id[2][u]*(p^2)+...+id[n][u]*(p^n) % q
如果id[i][u]=id[i][v](i=1~n) 則f(u)==f(v)
如果f(u)==f(v)則很大可能 id[i][u]=id[i][v](i=1~n)
令Hash[u]=f(u)
則在每次修改id[i][u]時順便O(1)修改Hash(u)即可O(1)查詢,判斷Hash[u]是否等於Hash[v].
這樣時間復雜度優化為O(邊數*log2(n*m)+邊數)是一個非常優秀的演算法,散列的魅力就在於此,空間換時間,效率高,比賽時只要p和q設的大一些,一些考演算法的題可以水個八九十分,還特別好寫,不會寫炸。

『肆』 計算機基礎 數據結構 雙重散列法 不知道什麼意思

(1)先搞清楚幾個記號:哈希表容量 m,存儲的數據個數 n,裝填因子 a = n/m,除留余數法構造的哈希函數一般形式為 H(k) = k % p,這里的 p 一般取不大於 m 的最大素數。
(2)也就是說,p 跟 m 不一定是相等的。至於第二個哈希函數中的 +1,也沒什麼大不了的,+20 也可以,這個完全是人為規定的,別忘了,在計算哈希地址的時候,無論哈希函數的結果如何,最後還有一個 %m,即形如 (... H(k) ...)%m,來保證哈希地址不會越界。

『伍』 散列法的散列演算法

也稱為哈希函數——哈希的英文意思為「無用信息」,因此哈希函數一詞的由來可能是因為最終形成的哈希表裡面是各種看起來毫無意義的描述值的混合。除用來快速搜索數據外,散列法還用來完成簽名的加密解密工作,這種簽名可以用來對收發消息時的用戶簽名進行鑒權。先用哈希函數對數據簽名進行轉換,然後將數字簽名本身和轉換後的信息摘要分別獨立的發送給接收人。通過利用和發送人一樣的哈希函數,接收人可以從數字簽名獲得一個信息摘要,然後將此摘要同傳送過來的摘要進行比較,這兩個值相等則表示數字簽名有效。
利用哈希函數對資料庫中的原始值建立索引,以後每獲取一次數據時都要利用哈希函數進行重新轉換。因此,哈希函數始終是單向操作。沒有必要通過分析哈希值來試圖逆推哈希函數。實際上,一個典型的哈希函數是不可能逆推出來的。好的哈希函數還應該避免對於不同輸入產生相同的哈希值的情況發生。如果產生了哈希值相同的情況,稱為沖突。可接受的哈希函數應該將沖突情況的可能性降到非常小。

『陸』 有關數據結構哈希表的問題

Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

hashing定義了一種將字元組成的字元串轉換為固定長度(一般是更短長度)的數值或索引值的方法,稱為散列法,也叫哈希法。由於通過更短的哈希值比用原始值進行資料庫搜索更快,這種方法一般用來在資料庫中建立索引並進行搜索,同時還用在各種解密演算法中。

設所有可能出現的關鍵字集合記為u(簡稱全集)。實際發生(即實際存儲)的關鍵字集合記為k(|k|比|u|小得多)。|k|是集合k中元素的個數。
散列方法是使用函數hash將u映射到表t[0..m-1]的下標上(m=o(|u|))。這樣以u中關鍵字為自變數,以h為函數的運算結果就是相應結點的存儲地址。從而達到在o(1)時間內就可完成查找。
其中:
① hash:u→{0,1,2,…,m-1} ,通常稱h為散列函數(hash function)。散列函數h的作用是壓縮待處理的下標范圍,使待處理的|u|個值減少到m個值,從而降低空間開銷。
② t為散列表(hash table)。
③ hash(ki)(ki∈u)是關鍵字為ki結點存儲地址(亦稱散列值或散列地址)。
④ 將結點按其關鍵字的散列地址存儲到散列表中的過程稱為散列(hashing).
比如:有一組數據包括用戶名字、電話、住址等,為了快速的檢索,我們可以利用名字作為關鍵碼,hash規則就是把名字中每一個字的拼音的第一個字母拿出來,把該字母在26個字母中的順序值取出來加在一塊作為改記錄的地址。比如張三,就是z+s=26+19=45。就是把張三存在地址為45處。
但是這樣存在一個問題,比如假如有個用戶名字叫做:周四,那麼計算它的地址時也是z+s=45,這樣它與張三就有相同的地址,這就是沖突,也叫作碰撞!
沖突:兩個不同的關鍵字,由於散列函數值相同,因而被映射到同一表位置上。該現象稱為沖突(collision)或碰撞。發生沖突的兩個關鍵字稱為該散列函數的同義詞(synonym)。
沖突基本上不可避免的,除非數據很少,我們只能採取措施盡量避免沖突,或者尋找解決沖突的辦法。影響沖突的因素
沖突的頻繁程度除了與h相關外,還與表的填滿程度相關。
設m和n分別表示表長和表中填人的結點數,則將α=n/m定義為散列表的裝填因子(load factor)。α越大,表越滿,沖突的機會也越大。通常取α≤1。
散列函數的構造方法:
1、散列函數的選擇有兩條標准:簡單和均勻。
簡單指散列函數的計算簡單快速;
均勻指對於關鍵字集合中的任一關鍵字,散列函數能以等概率將其映射到表空間的任何一個位置上。也就是說,散列函數能將子集k隨機均勻地分布在表的地址集{0,1,…,m-1}上,以使沖突最小化。
2、常用散列函數
(1)直接定址法:比如在一個0~100歲的年齡統計表,我們就可以把年齡作為地址。
(2)平方取中法
具體方法:先通過求關鍵字的平方值擴大相近數的差別,然後根據表長度取中間的幾位數作為散列函數值。又因為一個乘積的中間幾位數和乘數的每一位都相關,所以由此產生的散列地址較為均勻。
(3)除留余數法
取關鍵字被某個不大於哈希表表長m的數p除後所得余數為哈希地址。該方法的關鍵是選取m。選取的m應使得散列函數值盡可能與關鍵字的各位相關。m最好為素數(4)隨機數法
選擇一個隨機函數,取關鍵字的隨機函數值為它的散列地址,即
h(key)=random(key)
其中random為偽隨機函數,但要保證函數值是在0到m-1之間。
處理沖突的方法:
1、開放定址法
hi=(h(key)+di) mod m i=1,2,...,k(k<=m-1)
其中m為表長,di為增量序列
如果di值可能為1,2,3,...m-1,稱線性探測再散列。
如果di取值可能為1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)
稱二次探測再散列。
如果di取值可能為偽隨機數列。稱偽隨機探測再散列。開放地址法堆裝填因子的要求
開放定址法要求散列表的裝填因子α≤l,實用中取α為0.5到0.9之間的某個值為宜。
②二次探查法(quadratic probing)
二次探查法的探查序列是:
hi=(h(key)+i*i)%m 0≤i≤m-1 //即di=i2
即探查序列為d=h(key),d+12,d+22,…,等。
該方法的缺陷是不易探查到整個散列空間。
③雙重散列法(double hashing)
該方法是開放定址法中最好的方法之一,它的探查序列是:
hi=(h(key)+i*h1(key))%m 0≤i≤m-1 //即di=i*h1(key)
即探查序列為:
d=h(key),(d+h1(key))%m,(d+2h1(key))%m,…,等。
該方法使用了兩個散列函數h(key)和h1(key),故也稱為雙散列函數探查法。
2、拉鏈法
拉鏈法解決沖突的方法
拉鏈法解決沖突的做法是:將所有關鍵字為同義詞的結點鏈接在同一個單鏈表中。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指針組成的指針數組t[0..m-1]。凡是散列地址為i的結點,均插入到以t為頭指針的單鏈表中。t中各分量的初值均應為空指針。在拉鏈法中,裝填因子α可以大於1,但一般均取α≤1。
3、建立一個公共溢出區
假設哈希函數的值域為[0,m-1],則設向量hashtable[0..m-1]為基本表,另外設立存儲空間向量overtable[0..v]用以存儲發生沖突的記錄。
性能分析
插入和刪除的時間均取決於查找,故下面只分析查找操作的時間性能。
雖然散列表在關鍵字和存儲位置之間建立了對應關系,理想情況是無須關鍵字的比較就可找到待查關鍵字。但是由於沖突的存在,散列表的查找過程仍是一個和關鍵字比較的過程,不過散列表的平均查找長度比順序查找、二分查找等完全依賴於關鍵字比較的查找要小得多。
(1)查找成功的asl
散列表上的查找優於順序查找和二分查找。
(2) 查找不成功的asl
對於不成功的查找,順序查找和二分查找所需進行的關鍵字比較次數僅取決於表長,而散列查找所需進行的關鍵字比較次數和待查結點有關。因此,在等概率情況下,也可將散列表在查找不成功時的平均查找長度,定義為查找不成功時對關鍵字需要執行的平均比較次數。
注意:
①由同一個散列函數、不同的解決沖突方法構造的散列表,其平均查找長度是不相同的。
②散列表的平均查找長度不是結點個數n的函數,而是裝填因子α的函數。因此在設計散列表時可選擇α以控制散列表的平均查找長度。
③ α的取值
α越小,產生沖突的機會就小,但α過小,空間的浪費就過多。只要α選擇合適,散列表上的平均查找長度就是一個常數,即散列表上查找的平均時間為o(1)。
④ 散列法與其他查找方法的區別
除散列法外,其他查找方法有共同特徵為:均是建立在比較關鍵字的基礎上。其中順序查找是對無序集合的查找,每次關鍵字的比較結果為"="或"!="兩種可能,其平均時間為o(n);其餘的查找均是對有序集合的查找,每次關鍵字的比較有"="、"<"和">"三種可能,且每次比較後均能縮小下次的查找范圍,故查找速度更快,其平均時間為o(lgn)。而散列法是根據關鍵字直接求出地址的查找方法,其查找的期望時間為o(1)。
例子:例子:選取哈希函數h(k)=(3k)%11,用線性探測再散列法處理沖突。
試在0~10的散列地址空間中,對關鍵序列22,41,53,46,30,13,01,67構造哈希表,並求等概率情況下查找不成功的平均查找長度asl。

『柒』 請教哈希函數雙散列是如何計算的

關鍵字K1≠K2,但H(K1)= H(K2)。均勻的哈希函數可以減少沖突,但不能避免沖突。發生沖突後,必須解決;也即必須尋找下一個可用地址。在哈希表中,不同的關鍵字值對應到同一個存儲位置的現象。

開始插入59,i=0,h(59,0)=(59 mod 11 + 0*(1+59 mod 9)) mod 11=4,位置4與37沖突,繼續計算。

沖突1次,i=1,h(59,1)=(59 mod 11 + 1*(1+59 mod 9)) mod 11=10,位置10空,59插入到位置10。

如果再沖突,那麼i=2,繼續計算,以此類推。

25和72類似。

(7)雙散列演算法擴展閱讀:

選擇一個隨機函數,取關鍵字的隨機函數值為它的哈希地址,即H(key)=random(key),其中random為隨機函數。通常用於關鍵字長度不等時採用此法。

若已知哈希函數及沖突處理方法,哈希表的建立步驟如下:

Step1、取出一個數據元素的關鍵字key,計算其在哈希表中的存儲地址D=H(key)。若存儲地址為D的存儲空間還沒有被佔用,則將該數據元素存入;否則發生沖突,執行Step2。

Step2、根據規定的沖突處理方法,計算關鍵字為key的數據元素之下一個存儲地址。若該存儲地址的存儲空間沒有被佔用,則存入;否則繼續執行Step2,直到找出一個存儲空間沒有被佔用的存儲地址為止。

『捌』 散列演算法的演算法思想

我也只能說說思想

散列演算法的演算法就是爭取一個蘿卜一個坑的原則

比如說有5個數 12,25,30,45,50,這幾個數有個規律,就是十位數都不相同,

如果我設置一個散列函數f(value)=value/10;平常的時候,我們查找50,要比較

5次(其他演算法可能不同),這里用散列演算法只需要1次,就是解散列函數,key=50/10

=5,要找的數就在第5個位子.但是上面問題還是很多的,比如說查找55呢?就會出

錯<因為55解散列函數之後,也是在第5個位子>,還有等等等問題,很顯然這個是我

散列函數沒設置好,當你把散列函數設置好了後,由於數據的龐大,沖突很有可能

產生,那麼就需要我們來處理沖突了,所以寫散列演算法就是設置好的散列函數和

處理沖突的過程.這里散列演算法涉及的查找就跟查找的數量無關,跟沖突率有直接

的關系

『玖』 散列演算法的概念

在信息安全技術中,經常需要驗證消息的完整性,散列(Hash)函數提供了這一服務,它對不同長度的輸入消息,產生固定長度的輸出。這個固定長度的輸出稱為原輸入消息的「散列」或「消息摘要」(Message digest)。一個安全的哈希函數H必須具有以下屬性:
l)H能夠應用到大小不一的數據上。
2)H能夠生成大小固定的輸出。
3)對於任意給定的x,H(x)的計算相對簡單。
4)對於任意給定的代碼h,要發現滿足H(x)=h的x在計算上是不可行的。
5) 對於任意給定的塊x,要發現滿足H(y)=H(x)而y=x在計算上是不可行的。
6)要發現滿足H(X)=H(y)的(X,y)對在計算上是不可行的

『拾』 二次探測散列法

二次再散列法是指第一次散列產生哈希地址沖突,為了解決沖突,採用另外的散列函數或者對沖突結果進行處理的方法。

散列函數的選擇有兩條標准:簡單和均勻。

簡單指散列函數的計算簡單快速;

均勻指對於關鍵字集合中的任一關鍵字,散列函數能以等概率將其映射到表空間的任何一個位置上。也就是說,散列函數能將子集K隨機均勻地分布在表的地址集{0,1,…,m-1}上,以使沖突最小化。

(10)雙散列演算法擴展閱讀:

設所有可能出現的關鍵字集合記為U(簡稱全集)。實際發生(即實際存儲)的關鍵字集合記為K(|K|比|U|小得多)。

散列方法是使用函數h將U映射到表T[0..m-1]的下標上(m=O(|U|))。這樣以U中關鍵字為自變數,以h為函數的運算結果就是相應結點的存儲地址。從而達到在O(1)時間內就可完成查找。

其中:

① h:U→{0,1,2,…,m-1} ,通常稱h為散列函數(Hash Function)。散列函數h的作用是壓縮待處理的下標范圍,使待處理的|U|個值減少到m個值,從而降低空間開銷。

② T為散列表(Hash Table)。

③ h(Ki)(Ki∈U)是關鍵字為Ki結點存儲地址(亦稱散列值或散列地址)。

④ 將結點按其關鍵字的散列地址存儲到散列表中的過程稱為散列(Hashing)

參考資料來源:網路-二次探測散列法

熱點內容
雷霆戰機無盡腳本 發布:2024-11-07 06:33:57 瀏覽:350
二級c需要編譯運行嗎 發布:2024-11-07 06:33:09 瀏覽:590
編程器刷機 發布:2024-11-07 06:22:23 瀏覽:39
手機存儲秘籍 發布:2024-11-07 06:08:27 瀏覽:38
紅館壓縮包 發布:2024-11-07 06:06:13 瀏覽:658
dtls加密 發布:2024-11-07 05:58:38 瀏覽:256
用qq傳文件夾 發布:2024-11-07 05:51:22 瀏覽:664
安卓手機跟蘋果哪個打游戲好 發布:2024-11-07 05:46:22 瀏覽:795
如何製作土豆伺服器 發布:2024-11-07 05:27:49 瀏覽:812
機器碼反編譯教程 發布:2024-11-07 05:24:17 瀏覽:214