雜湊表演算法

2021-07-15 15:51:06 字數 1394 閱讀 9690

今天大概講一講雜湊表的原理,構造,衝突等。

雜湊(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表既滿足了資料的查詢方便,同時不占用太多的內容空間,使用也十分方便。打個比方來說,所有的資料就好像許...