1. 程式人生 > >查找--------哈希表的原理

查找--------哈希表的原理

html ext net 索引 這也 為什麽 -s 有關 記錄

這段時間 在 準備軟件設計師考試 目的是想復習一下 自己以前沒怎麽學的知識 在這個過程中 有了很大的收獲 對以前不太懂得東西 在復習的過程中 有了很大程度的提高

比如在復習 程序語言的時候 對編譯程序的處理過程和文法分析 有了全新的了解 作為一個半路出家 沒學過程序語言這門課的我來說 有一種醍醐灌頂的感覺 以前在看 javaweb技術內幕是

對裏面提的javac 的編譯原理 看的真的是 雲裏霧裏 哈哈哈 想想 也是醉了 最基礎的程序語言 都沒有看過 會想去理解javac 的編譯原理

(編譯程序 中間的處理過程 有 詞法分析 語法分析 語義分析 中間代碼生成 代碼優化 目標代碼生成 這次過程中 又有符號管理 和 出錯處理 倆個過程貫穿其中 除此之外 還有匯編、解釋程序系統等)

在 復習計算機網絡的時候 對 SMTP 有了全新的認識 以前上課的時候只是粗略的學了一下 很多東西並沒有搞懂 不知道 MIME是對 SMTP的 優化 傳統的 SMTP 只能傳輸 ASCII類型的字符 MIME 及多用途Internet郵件擴充協議 它的最初的設定是為了增加郵件的功能 啊哈哈哈 還記得在 javaweb 中 的 這種 文傳輸類型嗎 如 text/html 還有在文件上傳的時候 添加的文件類型後綴

技術分享圖片

技術分享圖片

*****************************************************

正文 關於 哈希表 在 java 的 體系在 聽的是 太多了 但是 對於 hash表 以前理解的並不是很多 只知道 這個很重要 在很多的地方 都聽過 但是對於 底層的原理 自己 知道的真的是微乎其微

哈希表 在 數據結構的位置

作用在 查找的篇章 關於查找 的內容在軟件設計師的教材上如下 和 數據結構(嚴蔚敏篇的內容差不多)

技術分享圖片

靜態查找有 順序查找 折半查找 分塊查找(索引查找 )

動態查找有 二叉排序樹 二叉平衡樹 B-樹 B+ 樹 .....

哈希表 的 設立 也是為了便於查找 哈希表放在了靜態和 動態的查找的 最後 為什麽》???

說明哈希表的重要性? 是的

前面的不管是 靜態查找 還是 動態查找 他們所記錄在結構中的相對位置 是隨機的 和記錄的關鍵字之間不存在確定的關系 因此在查找的過程中 需要進行一系列的比較

才能找到 要是理解這句話 差不多 就能明白 哈希表 設計的目的了吧 (前面的兩種排序 如我們傳統的排序 是在不確定裏面數據的情況下 進行的比較 所以 它的查找時間 是和N 有關 而 哈希表 想要做的是 我能不能不進行比較你只要給我一個數據 我就知道 它在哈希表中的存儲位置 )雖然他也沒法做到 查詢時間為 1 因為有沖突

技術分享圖片

技術分享圖片

關於 哈希函數的構造方法 如 直接定址法 數字分析法 平方取中法 隨機數法 除留余數法等 這裏就不一一說明了 僅簡紹一下直接定址法 它的方法時 取關鍵字的某個線性函數值為哈希地址 即: H(key)=key 或 H(key)=a*key+b 其中a b 為常數 (這種哈希函數叫做自身函數 ) 列如 統計每一個省份的人口數 可以將每個省份的編碼設為 關鍵字 哈希函數取關鍵字本身 H(key)=key 這裏著重說明一下 在構造哈希函數方法的之前 首先要明確什麽是 好的 哈希函數 若對於關鍵字集合中的任一個關鍵字,經哈希函數映像到地址集合中任何一個地址的概率都是相等的 , 則稱此類哈希函數為均勻的哈希函數。 簡而言之 就是 使用哈希函數的關鍵字 能夠均勻的分配到哈希表的每一個位置 從而避免沖突

技術分享圖片

處理沖突的方法 技術分享圖片

1 開放定址法 技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片


2 鏈地址法 它和開發地址發 有本質的差別 前一個是 為了 避免沖突而設定 這一個 是 ”接受沖突”

技術分享圖片

技術分享圖片

技術分享圖片

三個因素 : 哈希函數 處理沖突的方法 哈希表的填裝因子

技術分享圖片

*****************************************************************************************************************************************************

上面說的 哈希表的內容 有很多不足之處 要想對哈希表 有更加深入的了解 十分建議 去 看看數據結構的 查找 的 相關 概念

自己 在 學習java的時候 走了很多的彎路 很多知識 都是 不太了解 知其然 不知其所以然 這是因為 對 很多 計算機的 基礎概念的理解不太深入 或者是根本就不了解 在這種前提下 還想不斷的去學習最前沿的技術 這顯然是 不太明智的 因為樓蓋的再高 如果根基不穩的話 很容易塌的 這也是為什麽 對於考計算機研究生 要考 數據結構 計算機網絡 操作系統 組成原理等 知識

這也是為什麽校招那麽喜歡問 一些基礎的知識

因為對這些相對基礎的知識不太了解的話 就很難去理解 那些已經封裝好的東西 以及升華 比如 java虛擬機的知識 要是對計算機的底層 不太了解的話 理解java虛擬機的是相當吃力的 當然 遠不止java這些......

所以 最後 希望 那些半路出家的 人 能一起去 學一點 這些 相對 底層的東西吧 雖然它們都相當枯燥 但是靜下心去學 還是會有所收獲的

查找--------哈希表的原理