無論是陣列還是鍊錶,其對資料的查詢表現都比較無力,要想知道乙個元素是否在陣列或鍊錶中,只能從前向後挨個對比。出現這個問題的根源在於,沒有辦法直接根據乙個元素找到它儲存的位置,而雜湊表就是解決查詢問題的一種方案。
雜湊表就是通過關鍵字來獲取資料的一種資料結構,它通過把關鍵字對映為表中的位置來獲取元素,這種對映主要是使用hash函式。
hash函式,實際上是建立起key值與int值對映關係的函式。而雜湊表,就是乙個陣列,只是其元素不是按照陣列的規則排列的。任何乙個元素要放進雜湊表中,都必須先通過hash函式獲取到乙個int數值,這個數值經過處理後將作為它的存放位置,然後這個元素才能放進雜湊表中。
可以發現,陣列與雜湊表的操作不同之處主要在於,前者是直接插入,後者需要通過hash函式計算後再插入。
hash函式所做的事,就是無論什麼物件,都根據乙個規則對映為乙個int值。被轉換的物件有無數種可能,但是int的值是有限的,它只有232個,這樣一來,必然會有不同的物件,對映得到相同的int值,這就是所謂的雜湊碰撞。發生碰撞之後,就要把不同的元素插入到相同的位置,這時候單純的使用一維陣列已經無法滿足需求了。
將相同hash值的物件組織成乙個鍊錶放在hash值對應的槽位(jdk1.8之前)
當鍊表長度超過8使用紅黑樹(jdk1.8).
雜湊表是一種優化儲存的思想,具體儲存元素的依然是其他的資料結構。設計良好的雜湊表,能同時兼備陣列與鍊錶的優點,它能在插入和查詢時都具備良好的效能。然後設計不好的雜湊表,可能出現較多的雜湊碰撞,導致鍊錶過長,從而使得雜湊表更像乙個鍊錶。還有當資料量很大時,為房子鍊錶過長,就需要對陣列進行擴容,這時涉及到了陣列的拷貝,其對效能的影響比較嚴重。
資料結構之雜湊表(雜湊表)
今天學的是資料結構的雜湊查詢篇,其他的查詢可參見以前的傳送門 以前的查詢都是基於比較關鍵字的基礎上,所以查詢的效率依賴於查詢過程中所進行的比較次數。理想的情況是不經過任何比較,通過計算就能直接得到記錄所在的儲存位址,雜湊查詢 hashed search 是基於上述思想的一種查詢方式。雜湊法又稱為雜湊...
資料結構之雜湊表
雜湊表和雜湊化有乙個重要的概念是如何把關鍵字轉換成陣列下標,在雜湊表中這個轉換是通過雜湊函式來完成的。比如規定乙個單詞含有4個字元,對於單詞cats,我們採用 冪的連乘 的方式將乙個單詞對映成數字。因為有27個可能的字元,包括空格,所以冪採用27,則cats的數字下標是3 27 3 1 27 2 2...
資料結構之雜湊表
wikipedia上的解釋 下圖示意了雜湊表 hash table 這種資料結構。雜湊表 如上圖所示,首先分配乙個指標陣列,陣列的每個元素是乙個鍊錶的頭指標,每個鍊錶稱為乙個槽 slot 哪個資料應該放入哪個槽中由雜湊函式決定,在這個例子中我們簡單地選取雜湊函式h x x 11,這樣任意資料x都可以...