今天大概講一講雜湊表的原理,構造,衝突等。
雜湊(hash
)是什麼,其實雜湊就是一種對映,將一些線性資料通過乙個函式
h算出乙個值作為下表,定義乙個
a陣列單元來按照下標儲存資料。
舉例:離散優化就是一種特殊的雜湊,它的函式比較簡單。
如圖,如果這個陣列的資料下標不大的話,我們就可以直接排序算出距離,但當下標太大時,我們開不出那麼大的陣列,所以我們就可以採用一種特殊的雜湊思想,將每個兩個點截出的線段開乙個從下標1
開始的陣列來儲存。實際上就是把下標作為資料值存入乙個新的陣列裡,這樣使用時只用遍歷一下即可找到想要的點,又避免了陣列過大。
**:#include
#include
using namespace std;
int x[2000];
int mid(int a,int i,int j)else if(x[z]>a)
j=z-1;
else i=z+1;
int flag[3000];
main()
int n,a[2000],b[2000];
scanf("%d",&n);
int t=1,y;
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
x[t++]=a[i];
x[t++]=b[i];
sort(x+1,x+2*n+1);
int p,q,j;
for(int i=1;i<=n;i++){
p=mid(a[i],1,2*n);
q=mid(b[i],1,2*n);
for(j=p;j<=q-1;j++){
flag[j]=1;
構造雜湊的函式有多種型別,
包括:直接定址法(資料本身或關鍵字加上常量)、除餘法、數字分析法等。
但有時候雜湊表會出現乙個嚴重的問題,那就是不同的資料,不同的key
通過函式會得到相同的位址。這就非常尷尬了,所以我們必須解決這個問題。
1.拉鍊法,在同乙個位址定義乙個鍊錶儲存多個資料,當找資料時遍歷整個鍊錶。
2.開位址法,既然不能存在這,那就另外找個空的位址存就可以了,當遍歷找某個資料時找到空位址還沒發現則說明該資料未存入。
但是真的是這樣嗎?一旦我們刪了某個資料,那就有個位址空出來,就會漏根。所以刪除時千萬記得不要把位址內容標記為0
,而是其他的,以便查詢。
再說複雜度,原本看起來只有乙個衝突的一組資料在開位址後會發生連鎖反應,多次衝突。哈。。。所以我們又機智的想到我們可以再定義另乙個函式,使得開位址時跳一跳(延後幾個位址儲存),這樣就可以有效防止增加衝突。但記住這個往後跳的數值必須與表長互質,不然就可能出現死迴圈,就是算出來表已滿但實際並沒有。
就是這些,啊,太晚了,休息了。
雜湊表演算法
雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程式中,...
演算法 雜湊表
如果能在關鍵字與記錄儲存的位置之間建立一種聯絡,則可以不經過比較,直接對關鍵字進行計算得出記錄的位置,再到相應位置去讀取資料即可。將這種關鍵字與記錄儲存位置之間的對應關係稱為雜湊函式,將這種方式建立的表稱為雜湊表。include define hash len 13 define table len...
演算法 雜湊表
hash表,有時候也被稱為雜湊表。個人認為,hash表是介於鍊錶和二叉樹之間的一種中間結構。鍊錶使用十分方便,但是資料查詢十分麻煩 二叉樹中的資料嚴格有序,但是這是以多乙個指標作為代價的結果。hash表既滿足了資料的查詢方便,同時不占用太多的內容空間,使用也十分方便。打個比方來說,所有的資料就好像許...