學習雜湊和HashTable的第一天

2021-09-24 13:45:33 字數 1857 閱讀 6793

第一天學習雜湊表,對其概念不是很清晰,這裡簡單根據書上內容進行描述,一邊為加深記憶,一邊提高文筆養成寫部落格的習慣。作為一名初出茅廬的程式設計師,我知道未來的挑戰是艱鉅的,我要學的技術還很多,但路得慢慢走,相信不斷堅持下去,未來得我一定前途無量。

雜湊是一種常見的儲存資料的技術,採用這種技術可以快速的插入和檢索資料。雜湊所採用的資料結構我們稱為雜湊表,雖然雜湊表能夠快速插入和檢索,但對於查詢最大值和最小值效率卻大打折扣。雜湊是圍繞陣列設計的,為了把乙個元素儲存到雜湊表內,利用雜湊函式把鍵對映到乙個範圍從0到列表大小的數上。

雜湊函式可能會出現兩個鍵值雜湊到相同數值的情況,這種現象被稱為衝突,解決衝突的策略有桶式雜湊法、開發定址法、雙重雜湊法等,後面也會一一進行學習。

static

void

******hashtext()

; int hashval;

for(int i =

0; i <

10; i++

)次返回的hash值是"

, i,hashval)

; names[hashval]

= name;

}showdistrib

(names)

;}

// an highlighted block

//傳入鍵值及雜湊表,返回計算後的雜湊值

static int betterhash

(string s,string[

] arr)

次呼叫tot值是"

, i, tot);}

tot = tot % arr.

getupperbound(0

);if(tot <0)

return

(int)tot;

}

以上雜湊函式的作用是:函式接受乙個字串(鍵)和乙個雜湊表,利用霍納法則來計算多項式函式,產生乙個雜湊值,這樣計算出的雜湊值更均勻的分布!

雜湊表已經構造完成了,查詢雜湊表中的資料其實很簡單,思路是:計算鍵的雜湊值,然後訪問陣列中的對應元素,存在則找到,否則不存在雜湊表中。

//在雜湊表中查詢資料,首先計算鍵的雜湊值,然後訪問陣列元素

static bool inhash

(string s,string[

] arr)

else

}

在處理雜湊表的時候,不可避免的會遇到這種情況,即計算出的鍵的雜湊值以及儲存了另外乙個鍵,這就發生了衝突,在發生衝突時可以使用幾種技術,這些惡技術包括桶式雜湊法,開放位址法,和雙重雜湊法。

桶式雜湊法其實就是用arraylist來實現的,arraylist在執行時執行超出範圍,並會自動分配更多的空間,一般 是當前容量的2倍。

1、為了從雜湊中移除乙個值,首先得得到移除項的雜湊值,然後確認arraylist中是否存在,如果存在則移除,否則不做作任何操作。

public

void

insert

(string item)

}

2、為了插入乙個資料項,首先也是得到插入資料項的雜湊值,並判斷此資料項是否已經在arraylist內,如果存在則不做任何操作,否則插入。
public

void

remove

(string item)

}

總結:當使用桶式雜湊法時,應盡量保持所用的arraylist元素盡可能的少。在向雜湊表新增資料項或從雜湊表移除資料項時,這樣會最小化所需做的額外工作。雜湊表中元素數量與表大小的比率稱為負載係數,當負載係數為1.0時,或者表的大小剛好等於元素數量時,雜湊表的效能最佳

hash table 雜湊表(雜湊表)

hash table 也叫雜湊表。涉及到雜湊函式 雜湊衝突處理的問題。雜湊函式是雜湊表的關鍵,是用來從值到雜湊表索引 存放位置 的對映。比如 要存放乙個學校學生的姓名,他們是amanda,jack,andy,tom,bob,black等等500個人。我們可以設計乙個雜湊表,容量為500,來存放這些學...

HashTable 雜湊表(雜湊表)

雜湊表 雜湊表 是根據關鍵字 key 而訪問在記憶體位置的資料結構。其方法是 它通過乙個關鍵值的函式將所需的資料對映到表中的位置來訪問資料,這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表 雜湊表 構造雜湊表的幾種方法 直接定址法 取關鍵字的某個線性函式為雜湊位址,hash key key 或 h...

雜湊表(雜湊)HashTable實現

近期刷leetcode發現凡是找字串中反覆字元或者陣列中找反覆資料的時候就不知道從何下手了。所以決定學習一下雜湊表解題。雜湊表的原理主要是解決分類問題,hash表是介於鍊錶和二叉樹之間的一種中間結構。鍊錶使用十分方便,可是資料查詢十分麻煩 二叉樹中的資料嚴格有序,可是這是以多乙個指標作為代價的結果。...