您好,登錄后才能下訂單哦!
1、直接映射表
查找數(shù)據(jù)時,直接定位,時間復(fù)雜度為:O(1);
局限性:浪費(fèi)大量的內(nèi)存空間;
2、哈希表
(1)、用一個哈希函數(shù)Hash()來隨機(jī)映射那些鍵;
抽象模型
(2)、哈希沖突時:
i、鏈地址法,時間復(fù)雜度最壞:O(n);
簡單均勻哈希的時間復(fù)雜度:O(1+a);a:裝載因子
哈希函數(shù)的選?。撼粲鄶?shù)法;
ii、開放尋址法,沒有鏈表;
利用多次哈希函數(shù),探測空的位置,直到找到一個可以存放元素的位置即可;探查序列很重要!??!
插入、查詢就根據(jù)探查序列比較簡單,刪除比較難做;
探測序列:a、線性探測:一個挨一個位置的探測,往下掃描;
探測序列:b、二次哈希:2個哈希函數(shù)的和掃描;
哈希表越滿,其探查效率越低;
3、哈希表溢出,動態(tài)哈希怎么實(shí)現(xiàn)?
i、首先申請一個原哈希表2倍大的空間;
ii、在將舊有元素移到新的哈希表空間中;
iii、在釋放原有空間;
平攤分析的思想:
一個插入的平均代價時間復(fù)雜度:O(1);
n個元素的插入時間復(fù)雜度是:O(n);
4、哈希函數(shù)的所有鍵映射同一個槽,此時查詢效率極為低下。
(1)、問題關(guān)鍵:選擇哈希函數(shù),要隨機(jī)選擇,與輸入的哈希運(yùn)算的鍵保存獨(dú)立,程序員本身也不能確定在實(shí)際運(yùn)行時會用到哪一個哈希函數(shù),無法預(yù)測隨機(jī)數(shù)的輸出;----->全域哈希
(2)、全域哈希解決的問題:所有鍵都相同,此時隨機(jī)選擇哈希函數(shù)將會使其映射到不同的槽中;
哈希函數(shù)集H中隨機(jī)地選擇函數(shù)h,均勻的分布在哈希表中;
(3)、全域哈希的構(gòu)造:
i、槽的總數(shù)為m = 質(zhì)數(shù)時成立,k = <k_0,k_1,.....,k_r>把任意的鍵分解為r+1位,可以把k看成k_0,k_1......k_r(k_i >= 0 && k_i <= m-1),k用"m進(jìn)制"來表示;k不斷除m,取余在除(進(jìn)制轉(zhuǎn)換法)
ii、構(gòu)造一個a = <a0,a1,a2....ar>,隨機(jī)地從(0,1,2,....m-1)中選取元素分配到a集合中;
哈希函數(shù)集:k x a,k中的每一項(xiàng)和a中的每一項(xiàng)相乘,再把乘積全部加起來,在對m取余,就得到分配的槽數(shù);哈希函數(shù)集的大小:m^(r+1);
(4)、全域哈希是用隨機(jī)函數(shù)的思想,但是有很小很小的概率還是會沖突的,解決方案:完全哈希;
5、完全哈希
使用二級結(jié)構(gòu),在每一級都會用全域哈希,第一級可能會有沖突,但是第二級就沒有了;
(1)、算法模型
(2)、算法分析:
時間復(fù)雜度:O(1);
所需的存儲空間為:O(n);
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。