學習地址:https://www.bilibili.com/video/BV1Zt411o7Rn【數據結構與算法基礎-java版】
🚀數據結構--Java專欄:https://blog.csdn.net/weixin_44949135/category_10103369.html🚀
筆記01【01-09】https://blog.csdn.net/weixin_44949135/article/details/106742935【概述、數組基本使用】【源碼、課件】
筆記02【10-18】https://blog.csdn.net/weixin_44949135/article/details/106746038【棧、隊列、單鏈表、鏈表、遞歸】
筆記03【19-27】https://blog.csdn.net/weixin_44949135/article/details/106784224【八大排序算法】
筆記04【28-33】https://blog.csdn.net/weixin_44949135/article/details/106823785【樹結構概述、二叉樹】
筆記05【34-39】https://blog.csdn.net/weixin_44949135/article/details/106832176【順序存儲二叉樹、堆排、線索二叉樹】
筆記06【40-48】https://blog.csdn.net/weixin_44949135/article/details/106843814【赫夫曼樹、解碼、壓縮&解壓文件】
筆記07【49-54】https://blog.csdn.net/weixin_44949135/article/details/106886659【二叉排序樹】
筆記08【55-57】https://blog.csdn.net/weixin_44949135/article/details/106896570【平衡二叉樹(AVL)】
筆記09【58-60】https://blog.csdn.net/weixin_44949135/article/details/106852286【計算機數據存儲原理、2-3樹、B樹】
筆記10【61-63】https://blog.csdn.net/weixin_44949135/article/details/106936504【哈希表、散列函數設計、解決衝突】
筆記11【64-67】https://blog.csdn.net/weixin_44949135/article/details/106939350【圖概述、圖遍歷(DFS、BFS)】
目 錄
P61 5.1 哈希表概述
1、哈希表概念
百度百科:https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E8%A1%A8/5981869?fr=aladdin
散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。
給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數後,若能得到包含該關鍵字的記錄在表中的地址,則稱表M爲哈希(Hash)表,函數f(key)爲哈希(Hash)函數。
若關鍵字爲k,則其值存放在f(k)的存儲位置上。由此,不需比較便可直接取得所查記錄。稱這個對應關係f爲散列函數,按這個思想建立的表爲散列表。
對不同的關鍵字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),這種現象稱爲衝突(英語:Collision)。具有相同函數值的關鍵字對該散列函數來說稱做同義詞。綜上所述,根據散列函數f(k)和處理衝突的方法將一組關鍵字映射到一個有限的連續的地址集(區間)上,並以關鍵字在地址集中的“像”作爲記錄在表中的存儲位置,這種表便稱爲散列表,這一映射過程稱爲散列造表或散列,所得的存儲位置稱散列地址。
若對於關鍵字集合中的任一個關鍵字,經散列函數映象到地址集合中任何一個地址的概率是相等的,則稱此類散列函數爲均勻散列函數(Uniform Hash function),這就是使關鍵字經過散列函數得到一個“隨機的地址”,從而減少衝突。
哈希表(散列表):關鍵字年齡,通過存儲位置(取餘/減去固定值),返回相應的數據。
P62 5.2 散列函數的設計
散列函數的設計:計算簡單、分佈均勻。
直接定址法(直接、計算簡單、不好用、分佈不均勻):將關鍵字作爲 下標(存儲地址)。【電話號碼,不適合!】
數字分析法:需要提前知道關鍵字。
平方取中法:數字進行平方運算,取中間1、2、3個數字。
隨機數法:存儲地址=random();
哈希表底層,使用數組。
P63 5.3 散列衝突的解決方案
散列函數:解決地址衝突問題。【數據:11、12、22、21、23】【取餘法(%10)】
1、開放地址法
1.1、線性探測法
線性探測法:數據衝突,緊跟着數據 進行存儲。問題:數據聚集。
1.2、二次探測法
二次探測法:解決數據聚集問題。數據所在的位置,已有數據,根據 1^2、2^2、3^2……往後放。
1.3、再哈希法
散列函數
2、鏈地址法
鏈表:無限延伸。