1. 程式人生 > >散列表(has table、哈希表)

散列表(has table、哈希表)

cor 散列表 開頭 span pan 輸入 沖突 情況 查找

一. 散列表是什麽

 是包含映射關系的一種數據結構,可以提高查找效率。

二. 散列函數

 1)必須是一致的。假設輸入一個單詞“banana”,映射的數字是1,那麽以後每次輸入banana都要映射到數字1,否則散列表就沒用處了。

 2)應該把不同的輸入映射到不同的輸出。如果無論什麽輸入都映射輸出數字1,那麽就不是好的散列函數。理想的情況是,任何一個輸入,都有獨一無二的映射輸出。

三. 沖突

 將不同的鍵映射到不同的位置,實際上沒有這樣的散列函數可以一步到位。這就會導致沖突,也就是不同的鍵,映射到了同一個位置。怎麽辦呢?辦法很多,這裏說一個:如果兩個鍵映射到了同一個位置,那麽就在這個位置建一個鏈表,依次存儲鍵值對。當然,這也不是完美的辦法:假設有一串字母a開頭的單詞,它們分別對應不同的數值

,但他們映射的位置卻都是一樣的,那麽結果就是在內存的一個固定位置上建立了一個很長的鏈表,這樣的話查找起來仍然效率不高。所以,對於散列函數,要註意:

1)理想的散列函數可以把鍵均勻的映射到散列表的不同位置。

  2)理想的散列函數會使得在一個位置建立起來的鏈表不會變得不可接受的長。

散列表(has table、哈希表)