雜湊表(hash table)基礎概念

2022-09-14 03:09:12 字數 2033 閱讀 6129

引入:我們在學習陣列的時候,使用陣列元素的下標值即可訪問到該元素,所花費的時間是o(1),與陣列元素的個數n沒有關係,這就是雜湊方法的核心思想。

雜湊方法:以關鍵值k為自變數,通過一定的函式關係h(k)(雜湊函式)計算出對應的函式值,把這個值解釋為結點的儲存位址,將結點的關鍵碼(key)和屬性資料(value)一起存入此儲存單元中。檢索時,用同樣的函式計算出位址,找到對應的資料。

雜湊表:按雜湊儲存方式構造的儲存結構稱為雜湊表(hash table)

舉例:已知線性表關鍵碼值集合為s=,假設雜湊函式是關鍵碼k的第乙個字母在字母表中的序號,哪麼可以建立如下的雜湊表:

當然這個例子特別簡單,細心的同學很快就發現了二個問題:

分配的空間大小比實際所需的要大一點(一般情況下,雜湊表的空間(h)比結點的集合(m)大,這樣雖然浪費了空間,但是換來了檢索效率,稱α=m/h為雜湊表的負載因子

其實這就是接下來要談到的雜湊函式的選擇和衝突解決策略。

雜湊方法的核心就是雜湊函式的選擇,理想的雜湊函式應該使得結點「分布均勻」,且衝突少

為了簡單起見,以下的雜湊函式我們假設關鍵值都是整數(如果不是整數,哪也有特定的方法可以把它轉換為整數,畢竟在計算機世界裡,任何東西都是01組成的串)

除餘法:

關鍵值碼k除以m(往往取雜湊表的長度),並取餘數作為雜湊位址。

乘餘取整法

先讓關鍵碼k乘上乙個常數a(0有許多種雜湊函式可以選擇,每種都有其適用的場景,但是作為軟體開發工程師,我們只要理解它的思想就可以,至於什麼場景選擇什麼雜湊函式,哪大概率是數學家應該研究的問題。

優秀的雜湊函式可以盡可能的避免產生衝突,但是衝突的產生是不可避免地,這就是接下來要談到的衝突解決策略

衝突解決技術可以分為兩類,拉鍊法和開位址法,這兩種方法的不同之處在於,拉鍊法把發生衝突的關鍵碼儲存在雜湊表主表之外,而開位址法把發生衝突的關鍵碼儲存在表中另乙個槽內。

拉鍊法的一種簡單形式是把雜湊表中的每乙個槽定義為乙個鍊錶的表頭,雜湊到乙個特定槽的所有記錄都放到這個槽的鍊錶中。

開位址法把所有記錄直接儲存在雜湊表中。每個記錄關鍵碼k有乙個由雜湊函式計算出來的基位置,即h(k)。如果要插入乙個關鍵碼k,而另乙個記錄的關鍵碼已經佔據了k的基位置(發生衝突)則把k儲存在表中的其他位址內,至於其他位址怎麼選擇,有多種演算法,我們以順序探測法為例。

已知一組關鍵碼為,雜湊表長度l=15,用線性探查法解決衝突構造的雜湊表的過程如下:

利用除餘數作為雜湊函式,假設選擇m=13,則雜湊函式為:h(k)=k%13,按順序插入各個結點:

h(26)=0, h(36)=10,h(41)=2, h(38)=12, h(44)=5,01

2345

6789

1011

1213

1426

2541

4436

38h(15)=0,發生碰撞,因此需要進行探查,按照順序探測法,顯然3為開放的空閒位址,因此可以將其放在3單元。01

2345

6789

1011

1213

1426

2541

15

4436

3868和12也類似,最後的雜湊表如下所示:12

3456

78910

1112

1314

2625

4115

6844636

3812

51

C 基礎 雜湊表(Hashtable)

hashtable類代表了一系列基於鍵的雜湊 組織起來的鍵 值對。它使用鍵來訪問集合中的元素。當您使用鍵訪問元素時,則使用雜湊表,而且您可以識別乙個有用的鍵值。雜湊表中的每一項都有乙個鍵 值對。鍵用於訪問集合中的專案。hashtable 類的方法和屬性 常用屬性 屬性描述 count 獲取 hash...

hash table 雜湊表(雜湊表)

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

HashTable 雜湊表(雜湊表)

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