你有沒有遇到過這樣的情況:想找一本書,書架上有幾百本,只能一本本翻,特別慢?數據結構裏也有類似的問題——如果用數組存數據,想找某個元素時,可能得從頭翻到尾,這就是“順序查找”,速度很慢。那有沒有辦法讓查找像“按編號找抽屜”一樣快?答案就是哈希表!
哈希表是什麼?¶
哈希表(也叫散列表)是一種能讓存儲和查找數據更快的工具。它的核心是通過一個“哈希函數”,把要存的數據“翻譯”成一個固定的位置(我們叫它“桶”),這樣下次找數據時,直接算這個位置就能找到,不用再翻遍所有數據。
核心工具:哈希函數¶
哈希函數就像一個“翻譯器”:輸入是數據,輸出是一個數字(哈希值),這個數字對應着哈希表中的一個“桶”(可以理解爲數組的一個格子)。比如你要存學生的學號,哈希函數可以是“取學號的最後兩位數字”,或者“學號除以100的餘數”,然後把這個餘數作爲桶的編號。
舉個例子:
假設我們要存學號12345的學生信息,哈希函數設計爲“取學號後兩位”,那麼12345的最後兩位是45,哈希值就是45,對應哈希表的第45號桶。
數據是怎麼存到哈希表的?¶
存數據就像“把鑰匙放進對應的抽屜”,步驟很簡單:
1. 準備數據¶
先確定要存的數據,比如一條數據包含“學號(key)”和“姓名(value)”,我們用學號作爲查找的“鑰匙”。
2. 計算哈希值¶
把學號輸入哈希函數,得到哈希值。比如學號23456,用“取後兩位”的哈希函數,23456%100=45,哈希值就是45。
3. 定位桶的位置¶
哈希值45就是桶的編號(假設哈希表是一個數組,桶的編號就是數組的下標)。
4. 處理衝突¶
如果多個數據算出的哈希值相同(比如學號12345和23456都算出哈希值45),就會出現“衝突”(多個數據想進同一個桶)。解決衝突的常用方法有兩種:
- 鏈表法:每個桶裏掛一個鏈表,新數據直接“掛”在鏈表末尾(比如桶45裏先放12345,再把23456掛在它後面)。
- 開放尋址法:如果桶45已滿,就找下一個空桶(比如46號桶),把數據存進去。
哈希表爲什麼查找快?¶
比如你想找學號12345的學生:
1. 用哈希函數算:12345%100=45;
2. 直接定位到第45號桶;
3. 在桶裏找學號12345(如果桶裏是鏈表,就順着鏈表找;如果是空桶,直接找到)。
整個過程不用遍歷所有數據,只需要算一次哈希值,再在桶裏找,速度快得像“按編號開鎖”!
總結¶
哈希表通過哈希函數把數據“翻譯”成桶的位置,讓查找從“翻遍所有”變成“直接定位”。它就像圖書館的“圖書分類編號”,你只需根據編號(哈希值)就能快速找到書(數據)。從手機通訊錄到網站緩存,哈希表無處不在,核心就是用“哈希函數”讓查找變簡單。