雜湊表資料結構 一看就懂的資料結構基礎 雜湊表

2021-10-12 07:43:54 字數 2164 閱讀 2248

雜湊表

雜湊表(hash table),是儲存鍵值(key value)對資料的一種資料結構。

例如,我們可以將人的名字作為鍵,性別作為值來儲存。通過把鍵對映到表中的乙個位置來訪問資料,以提高查詢速度。而這個對映關係就是雜湊函式。

雜湊函式

因為雜湊表的資料對映關係以雜湊函式為體現,為了避免小夥伴對雜湊函式不夠了解,此處先介紹雜湊函式。

雜湊函式可以把給定的資料轉換成固定長度的無規律數值,可以把它想象成一台處理器,如下圖所示:

輸入的資料經過加工後,會輸出對應的「雜湊值」。雜湊值多用十六進製制表示(十六進製制數範圍是,數字0~9和字母a~f)。而計算機中則使用0和1表示的二進位制來管理這些資料,實際上,雜湊函式就是計算機內部進行的某種運算。

雜湊函式的五個基本特徵:

不管輸入資料大或小,輸出的雜湊值資料長度固定不變

如果輸入的資料相同,那麼輸出的雜湊值也必定相同

輸入相似的資料並不會導致輸出的雜湊值也相似

即使輸入的資料完全不同,輸出的雜湊值也有可能相同,這種情況叫作「雜湊衝突」

雜湊函式的輸入、輸出不可逆,即無法反向推算出原資料

雜湊表結構

如果將鍵值對資料儲存在固定大小的陣列中,那麼當需要查詢某個資料時,我們只能從頭開始遍歷,我相信你已經很熟悉了,這就是「線性查詢」。資料量越多,線性查詢耗費的時間就越長,從耗時來看,此處使用陣列來儲存資料並不理想。

但使用雜湊表就可以解決這個問題,首先,仍然使用具有5個儲存空間的陣列來儲存資料。現在,嘗試將sue的鍵值對資料存入陣列,使用雜湊函式(hash)計算sue的雜湊值,得到的結果為83491,將雜湊值對5取模(mod),求得餘數1。因此,我們將sue資料儲存在陣列1號空間中。

重複前面的操作,tom鍵的雜湊值為84274,mod 5後結果為4,將tom資料儲存到4號空間中。

bat鍵的雜湊值為66549,mod 5後餘數為4,按照前述操作來看,我們應當將其存入4號空間中,但4號空間已經儲存了tom的資料,這種儲存位置重複的情況叫作「衝突」。遇到此種情況,可使用鍊錶結構在已有的資料後面繼續儲存資料,關於鍊錶的內容可見「鍊錶」篇。

繼續儲存amy資料,amy鍵的雜湊值為65965,mod 5後的餘數為0,將其儲存在0號空間中。

tan鍵的雜湊值為83841,mod 5後的餘數為1。本應將其儲存在陣列1號空間中,但1號空間已有sue的資料,故而使用鍊錶,在sue後面繼續儲存tan的資料。

rob資料同上,其雜湊值為82341,mod 5後的餘數為1,因「衝突」,使用鍊錶結構,繼續儲存在tan資料的後面。

像這樣儲存完資料,雜湊表也就製作完成了。

查詢雜湊表的資料也很簡單,先計算出目標資料鍵的雜湊值,然後對其進行mod運算,得到餘數即是陣列對應的空間索引。如果這個資料正好儲存在陣列空間上,那當然是皆大歡喜,如果不在,就需要對單鏈表進行線性查詢了。

說明

雜湊表中,可以通過雜湊函式(hash)快速獲取陣列中的目標資料。如果出現「衝突」,可以使用單鏈表在已有資料的後面插入新資料來解決衝突,這個方法被稱為「鏈位址法」。這樣不管資料量是多少,都可以靈活處理。

陣列空間越小,雜湊表衝突的概率就越大,對單鏈表的線性查詢頻率就越高。反過來,如果陣列空間過大,又會出現很多閒置的儲存空間,因此,設定合適的陣列空間非常重要!

一看就懂的知識點 資料結構之廣義表

廣義表 又稱列表lists 是n 0個元素a a an 1的有限序列,其中每乙個ai或者是原子,或者是乙個廣義表。舉例 1.廣義表中的資料元素有相對次序 乙個直接前驅和乙個直接後驅 2.廣義表的長度定義為最外層所包含元素的個數 3.廣義表的深度定義為該廣義表展開後所含括號的重數 a b,c 的深度為...

一看就懂的SwitchHosts

switchhosts 是乙個管理 切換多個 hosts 方案的工具。它是乙個免費開源軟體。日常開發工作中,我們可能經常需要切換各種 hosts 繫結,比如在本地開發時可能需要乙個開發環境的 hosts 繫結方案,發布到測試環境後又有乙個測試環境的 hosts 繫結方案,然後可能還有乙個預發布環境,...

一看就懂的氣泡排序

不用走啦,看得懂的啦!相鄰兩個數比較大小,較大的下沉 較小的上浮。從第乙個數開始,比較第乙個數和第二個數大小,如果第乙個數比第二個數大,則交換兩個數的位置,使大的數排在後面,依次比較第二個數和第三個數,使第三個數比第二和第乙個數大,直到倒數兩個數,將最大的數移動到最後一位。演算法分為兩個迴圈 1.外...