《資料結構和演算法分析》學習之雜湊表

2021-06-22 08:48:14 字數 943 閱讀 1203

這裡只是簡單的介紹一下,了解一下其比較強大的功能。肯定還有很多比較使用改進方法,需要多學習才行。

在進行查詢的過程中,無論是線性查詢還是二分查詢,其對都是時間的函式乙個是o(n),乙個是o(log2n);

而雜湊表進行查詢的時候,時間函式是o(1),其對時間來說是個常數,跟資料的規模沒有關係。

其主要通過直接索引來實現的(我是這樣理解的)

比如有31個在0-999中的數,我們要查詢這31個數中的乙個數。

可以通過陣列儲存這31個數,然後順序搜尋,或者排序,二分查詢。

隨著資料規模的曾加,時間也在增加。

雜湊表則不同,雜湊表是申請乙個1000大小的陣列,然後用陣列的下表表示所儲存的數字

table[1000]。比如裡面有乙個數330,則有table[330] = 330。這31個數都是這樣儲存,但是1000大小的陣列儲存31個數的話是沒辦法填滿的。這個可以根據自己的需要自行填充。這樣在查詢330的時候,直接就是判斷table[330]是不是330。一次查詢就可以得出結果,而且不論資料規模有多大。但是仔細想就會發現,有不好的地方,就是對儲存空間太浪費了,1000中只用了31,這中浪費實在是奢侈。

這個時候有一種方法可以解決,就是只申請31個儲存空間來儲存這31個數,然後每個數用num  = number%31,table[num] = num來儲存。這樣避免了空間的浪費。但是會有衝突產生。比如number = num+31*k的數按照上面的式子計算出來都是num。所以這時候都用table[num]來儲存就會產生衝突。

這時候有一種衝突處理策略就是,在衝突發生的時候,在num點向下進行迴圈掃瞄空位置,然後把這個數字填充過去。這個時候實際上是降低了時間效率來獲取空間效率。

當進行乙個數查詢的時候,實際是上先用table[num]進行判斷此時存不存在,或這個位置是不是所要查詢的數。如果不是,就從這個位置向下進行迴圈線性搜尋。

這個演算法的效率在前兩步體現出來,可以快速判斷這個數存不存在。

資料結構和演算法之 雜湊表下

雜湊表和煉表經常組合起來使用,但它們是如何組合起來使用的,為什麼它們會經常一塊使用呢?基於鍊錶實現 lru 快取淘汰演算法的原理是這樣的 我們維護乙個有序單鏈表,越靠近鍊錶頭部的結點是越早訪問的。當有乙個新的資料被訪問時,我們從煉表頭開始順序遍歷鍊錶。如果此資料之前已經被快取在鍊錶中了,我們將其從原...

資料結構之雜湊表(雜湊表)

今天學的是資料結構的雜湊查詢篇,其他的查詢可參見以前的傳送門 以前的查詢都是基於比較關鍵字的基礎上,所以查詢的效率依賴於查詢過程中所進行的比較次數。理想的情況是不經過任何比較,通過計算就能直接得到記錄所在的儲存位址,雜湊查詢 hashed search 是基於上述思想的一種查詢方式。雜湊法又稱為雜湊...

資料結構與演算法之雜湊表

介紹 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。應用 看乙個實際需求,google公司的乙個上機題 有乙個公司,...