雜湊表 hashtable和陣列

2021-08-30 14:24:06 字數 2090 閱讀 4425

一列鍵值對資料,儲存在乙個table中,如何通過資料的關鍵字快速查詢相應值呢?不要告訴我乙個個拿出來比較key啊。

大家都知道,在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標直接定位到相應的陣列空間,就不需要乙個個查詢。而雜湊表就是利用陣列這個能夠快速定位資料的結構解決以上的問題的。

具體如何做呢?大家是否有注意到前面說的話:「陣列可以通過下標直接定位到相應的空間」,對就是這句,雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式既所謂的雜湊函式轉換成乙個整型數字,然後就將該數字對陣列長度進行取餘,取餘結果就當作陣列的下標,將value儲存在以該數字為下標的陣列空間裡,而當使用雜湊表進行查詢的時候,就是再次使用雜湊函式將key轉換為對應的陣列下標,並定位到該空間獲取value,如此一來,就可以充分利用到陣列的定位效能進行資料定位。

不知道說到這裡,一些不了解的朋友是否大概了解了雜湊表的原理,其實就是通過空間換取時間的做法。到這裡,可能有的朋友就會問,雜湊函式對key進行轉換,取餘的值一定是唯一的嗎?這個當然不能保證,主要是由於hashcode會對陣列長度進行取餘,因此其結果由於陣列長度的限制必然會出現重複,所以就會有「衝突」這一問題,至於解決衝突的辦法其實有很多種,比如重複雜湊的方式,大概就是定位的空間已經存在value且key不同的話就重新進行雜湊加一併求模陣列元素個數,既 (h(k)+i) mod s , i=1,2,3…… ,直到找到空間為止。還有其他的方式大家如果有興趣的話可以自己找找資料看看

有很多人討論訪問陣列和map哪個快

直接訪問陣列下標當然最快咯,o(1)的時間。 可以直接定位到下標所對應的陣列的值!!但問題是你通常都不知道要訪問的元素的下標是多少,1這個時候就要遍歷陣列來找到這個元素,這個時候map的優勢就體現出來了,通常比陣列要快!!

map是用來查詢的。

請問hashtable類裡面的hash函式是怎麼樣的?

他是呼叫每個類自己本身的hashcode的方法來確定的

public synchronized v put(k key, v value)

// makes sure the key is not already in the hashtable.

entry tab = table;

int hash = key.hashcode();

int index = (hash & 0x7fffffff) % tab.length;

for (entrye = tab[index] ; e != null ; e = e.next)

}modcount++;

if (count >= threshold)

// creates the new entry.

entrye = tab[index];

tab[index] = new entry(hash, key, value, e);//存入雜湊表中

count++;

return null;

這是存入時的**!!根據獲取hashcode 對陣列的大小取餘!~獲取下標!

if ((e.hash == hash) && e.key.equals(key))

看這段**!但出現key相同時會把第二個儲存第乙個忽略掉

關於hash函式的如何取看鏈結

[url]

下面看兩個面試題

a)請問雜湊表 (hashtable) 是如何儲存資料的 ?

答案: hashtable 是用來儲存 key 和 value 對的資料結構 , 根據設定的 hash 函式 h(key) 和處理衝突的方法將一組關鍵字( key )映象到乙個有限的連續的位址集(區間)上,並以關鍵字在位址集中的「象」作為記錄在表中儲存位置,這種表便成為 hashtable.

b)是否兩個鍵值通過 hash 函式產生的對映位址會一樣?怎麼辦?

答案 : 是,一般情況下,完全避免衝突是很難的。因為通常關鍵字集合會比目標位址空間大。雜湊函式要盡量避免衝突(避免不同的關鍵字產生相同的 hash 值),使一組關鍵字的哈西位址盡可能的均勻分布在整個位址區間。所以有一些衝突處理方法:開放定址法,再雜湊法,鏈位址法(用鍊錶儲存衝突的值),公共溢位區。

hash table 雜湊表(雜湊表)

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

HashTable 雜湊表(雜湊表)

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

HashTable雜湊表 雜湊表(雜湊桶)

處理雜湊衝突的開鏈法 拉鍊法 雜湊桶 使用素數做雜湊表的長度,可以降低雜湊衝突 素數表size t getnextprime size t num 素數表 雜湊桶的節點的定義 template struct hashnode 在插入前檢查容量,以及負載因子。不夠就進行增容,按素數表進行增,以減小雜湊...