今天聊聊「雜湊表」,「雜湊表」主要作用在於高效查詢。
在程式設計實現中,常常面臨著兩個問題:儲存和查詢,儲存和查詢的效率往往決定了整個程式的效率。
腦補下,你在家裡忘記了指甲刀放在**,通常要在你家所有抽屜中順序尋找,直到找到,最差情況下,有n個抽屜,你就要開啟n個抽屜。這種儲存方式叫陣列,查詢方法稱為「遍歷」。
腦補下,你是乙個整理控,所有物品必須分門別類放入整理箱,再將整理箱編號,比如1號放入針線,2號放入證件,3號放入細軟。這種儲存和查詢方式稱為「雜湊」,如果這個時候要查詢護照,你不許要再翻所有抽屜,直接可在2號整理箱中獲取,通常只用一次查詢即可,如何編號整理箱,稱為雜湊演算法。
同樣是查詢,差距怎麼那麼大涅~,假設我們有100億條資料記錄,那差距就變得明顯,遍歷需要查詢最多100億次,最少1次,雜湊只需1次。
讓我們正式介紹雜湊和雜湊演算法,雜湊也稱雜湊,雜湊表是一種與陣列、鍊錶等不同的資料結構,與他們需要不斷的遍歷比較來查詢的辦法,雜湊表設計了乙個對映關係f(key)= address,根據key來計算儲存位址address,這樣可以1次查詢,f既是儲存資料過程中用來指引資料儲存到什麼位置的函式,也是將來查詢這個位置的演算法,叫做雜湊演算法。
讓我們舉個例子,比如下面這幾個人物,按陣列儲存:
這樣我要找到大胸姐的**號碼,需要順序查詢對比整個陣列,第乙個餘罪,不是,第二個不是,第三個不是,直到第四個找到大胸姐。
如果以hash儲存呢?首先讓我們來看看如何設計雜湊演算法,雜湊演算法可以隨意設計,教科書上一般會說以下幾種方法:直接定址發,平方取中法,除數取餘法,雜湊演算法的本質上是計算乙個數字,如果用這幾種方法講解會稍顯晦澀,我們假設我們的雜湊演算法是取姓名的首字母。所以f(餘罪) = y, f(傅老大) = f,f(沈嘉文) = s,f(大胸姐) = d。
構建的hash表如下:
我們看到他們分別以姓名首字母的位置插入到這一張**中,這樣我們構建了這樣乙個key-value**,此表就是雜湊表,也稱為hash table。未來,當我們要查詢餘罪的時候,通過計算,餘罪在y位置,可以通過1次查詢,找到這條記錄,也即手機號。
這個時候有客官問了,那以首字母為雜湊函式的話,應該有很多比如以y的姓名啊,這個時候就不是一次查詢了吧,其實有很多條記錄都對映到乙個位置上,稱為雜湊衝突。
雜湊衝突是跟雜湊函式的設計正相關的,你的隨機性越大,那麼產生雜湊衝突的可能性越小,在小概率下,如果還有衝突怎麼辦,這個時候要做些有損的設計,比如如果有兩個首字母為y的姓名,那麼可以接到餘罪的後面,當查詢的時候,需要先查找到y,然後再順序查詢,如圖所示:
還有一些解決雜湊衝突的辦法叫「雜湊再雜湊」,也就是針對第一次雜湊的結果再進行一次hash來減小衝突的概率。
這就是hash表,首先ta是一種資料結構,是一種效率極高的查詢方式,雜湊表的核心在於雜湊函式的設計,雜湊衝突了不要緊,我們要增加隨機性以及對衝突進行適當的有損化的處理。
什麼是程式設計師
乙個大專學歷想做程式設計師的朋友和我的對話,很短,我覺得,至少能說明我的心情和對程式設計師職業理解的乙個側面。2008 07 28 12 11 37 卿飄飄 大哥現在還寫程式不?2008 07 28 12 12 51 青潤寫。2008 07 28 12 16 10 卿飄飄 哦 你覺得三十歲後還寫程式...
程式設計師!什麼是機會?
我一直認為老天很公平,對於我們做it的也是很公平。我剛畢業那會老是感覺老天沒給我機會展示我的實力。後來我自己分析下,假如有人讓我做專案經理,我能怎麼做?我發現我只是抱怨沒給我機會,實際上,就算給我機會,我也很可能抓不住機會,因為我根本知道更加高階的職位需要做什麼?我的能力能做到什麼。剩下來就是我們老...
什麼是好的程式設計師
什麼是好的程式設計師 什麼是好的程式設計師?是不是懂得很多技術細節?還是懂底層程式設計?還是程式設計速度比較快?我覺得都不是。對於一些技術細節來說和底層的技術,只要看幫助,查資料就能找到,對於速度快,只要編得多也就熟能生巧了。我認為好的程式設計師應該有以下幾方面的素質 1 有專研精神,勤學善問 舉一...