《演算法》 查詢 雜湊表

2021-10-24 12:14:41 字數 1286 閱讀 5844

雜湊表也是一種符號表,主要特徵是可以將鍵通過雜湊函式對映為乙個陣列索引,然後利用這個陣列索引就可以做很多東西。

當我們輸入乙個物件,不論這是個什麼東西,經過雜湊函式處理之後輸出乙個0到m-1的範圍之內的整數。

對於雜湊函式有一些要求:

相等的物件(使用equals()函式)的雜湊值是相同的

2.同樣的雜湊值不同的兩個物件不相等

3.在輸出範圍之內盡量均勻分布

下面介紹兩種實現雜湊表的方式,分別基於拉鍊發和線性探測法。

假設鍵的數目為n,陣列大小為m,一般對於拉鍊法,n是大於m的。我們將某個鍵雜湊到0到m-1中的乙個數,那麼隨著鍵的數目的增加,兩個鍵之間一定會有重複的索引,這就發生了所謂的碰撞衝突,拉鍊法解決碰撞衝突的方法就是每個陣列位置儲存乙個鍊錶的引用,每個新加入的鍵先找到陣列的位置,然後插入對應的鍊錶。查詢的時候同樣的,先對要查詢的鍵進行雜湊,然後到相應位置的鍊錶中查詢。對於拉鍊法,每個鍊錶的平均長度為n/m,那麼可以看出他比乙個無序鍊錶或者陣列的效能提高了m倍。看著下面的圖應該很好理解。

對於線性探測法,陣列容量是大於鍵的數量的,並且在後面可以看到,陣列不能太滿,否則影響效能。主要思想是,我們維護兩個陣列,乙個是鍵的陣列,乙個是值得陣列,當我們將乙個鍵雜湊到陣列中的時候,如果當前位置是空的,那麼就直接插入,如果已經有了元素,那麼就往下乙個位置插入,如果還是被佔了,那就繼續,直到找到乙個空位置,然後再插入。查詢的時候也是一樣,根據鍵雜湊的位置我們去查詢,如果當前位置的鍵和要查詢的鍵不相同,那麼就繼續往後查詢,要麼找到,要麼又碰到空的位置,那麼此時就是查詢未命中。看著下面的圖,就能對這個過程有著清楚地了解。

線性探測法的乙個重要的操作是刪除,但是刪除不能僅僅將某個鍵置為null,因為這樣如果它後面本來還有的鍵就可能因為這個null鍵而訪問不到,我們的做法是將這個置為null之後直到下乙個null鍵之間的資料重新加入雜湊表。**見後面的delete()方法。

對於線性探測甚至拉鍊法,我們都需要調整陣列大小來保證效能。對於線性探測法,我們需要新建乙個linearprobinghashst()物件,只是新建物件的時候要擴大容量,然後把當前物件的資料重新put()進新的物件裡面,最後把新物件的兩個陣列的引用傳給當前陣列。

參考:《演算法4》雜湊表

查詢演算法 雜湊演算法,雜湊表查詢

那麼問題來了,如果集合s中同時存在值k 16和值k 27,我們該如何將兩個位址一樣的值存入雜湊表呢?常用的雜湊函式 處理衝突的方法 2.連位址法 雜湊表涉及的是一種對映關係,可以根據某個值查詢到關鍵字的位址,這樣的做法省去了比較的時間,優化了演算法。雜湊表是把值 關鍵字 存到跟它具有 唯一 對映的格...

演算法 查詢 雜湊表查詢

查詢除了線性表的查詢 順序 二分 分塊 樹上查詢 bst b 樹 還有一種雜湊查詢。相比於前兩種查詢,雜湊表的查詢效率驚人的高o 1 它採用的直接定址技術,基本上就是實現了精準打擊,達到一擊而中的效果。所謂的直接定址技術,說白了,就是儲存記錄時,通過雜湊函式計算出乙個雜湊位址 讀取記錄時,通過同樣的...

查詢演算法(II)雜湊查詢 雜湊表 Hash

雜湊 hash 同順序 鏈結和索引一樣,是儲存集合的又一種方法。不同的是,雜湊表 雜湊表 在元素的儲存位置和它的關鍵字之間建立了乙個對應關係。雜湊儲存的基本思想是 以每個元素的關鍵字k為自變數,通過乙個函式 稱為雜湊函式或雜湊函式 計算出函式值,把這個值 雜湊位址或雜湊位址 解釋為一塊連續儲存空間 ...