雜湊尋找因何快?我們使用它需要付出什麼代價

來源:互聯網
上載者:User

hash表是把一系列無序的記錄的存放位置以一種有序的方式存放,主要是解決鏈表結構尋找時的效率問題。 

我們經常用到Hashtable這種結構,當遇到鍵-值對儲存,採用Hashtable比ArrayList尋找的效能高。


1)hash它為什麼對於鍵-值尋找效能高
學過資料結構的,都應該曉得,線性表和樹中,記錄在結構中的相對位置是隨機的,記錄和關鍵字之間不存在明確的關係,因此在尋找記錄的時候,需要進行一系列的關鍵字比較,這種尋找方式建立在比較的基礎之上,在.net中(Array,ArrayList,List)這些集合結構採用了上面的儲存方式。
比如,現在我們有一個班同學的資料,包括姓名,性別,年齡,學號等。假如資料有

姓名 性別 年齡 學號
張三 15 1
李四 14 2
王五 14 3

假如,我們按照姓名來尋找,假設尋找函數FindByName(string name);
1)尋找“張三”
只需在第一行匹配一次。
2)尋找"王五"
   在第一行匹配,失敗,
   在第二行匹配,失敗,
   在第三行匹配,成功
上面兩種情況,分別分析了最好的情況,和最壞的情況,那麼平均尋找次數應該為 (1+3)/2=2次,即平均尋找次數為(記錄總數+1)的1/2。
儘管有一些最佳化的演算法,可以使尋找排序效率增高,但是複雜度會保持在log2n的範圍之內。
如何更更快的進行尋找呢。我們所期望的效果是一下子就定位到要找記錄的位置之上,這時候時間複雜度為1,尋找最快。如果我們事先為每條記錄編一個序號,然後讓他們按號入位,我們又知道按照什麼規則對這些記錄進行編號的話,如果我們再次尋找某個記錄的時候,只需要先通過規則計算出該記錄的編號,然後根據編號,在記錄的線性隊列中,就可以輕易的找到記錄了 。
注意,上述的描述包含了兩個概念,一個是用於對學生進行編號的規則,在資料結構中,稱之為雜湊函數,另外一個是按照規則為學生排列的順序結構,稱之為雜湊表。
仍以上面的學生為例,假設學號就是規則,老師手上有一個規則表,在排座位的時候也按照這個規則來排序,尋找李四,首先該教師會根據規則判斷出,李四的編號為2,就是在座位中的2號位置,直接走過去,“李四,哈哈,你小子,就是在這。”
看看大體流程:
  
從上面的圖中,可以看出雜湊表可以描述為兩個筒子,一個筒子用來裝記錄的位置編號,另外一個筒子用來裝記錄,另外存在一套規則,用來表述記錄與編號之間的聯絡。這個規則通常是如何制定的呢。
a)直接定址法:
   我在前一篇文章對GetHashCode()效能比較的問題中談到,對於整形的資料GetHashCode()函數返回的就是整形   本身,其實就是基於直接定址的方法,比如有一組0-100的資料,用來表示人的年齡
那麼,採用直接定址的方法構成的雜湊表為:

0 1 2 3 4 5
0歲 1歲 2歲 3歲 4歲 5歲
.....
這樣的一種定址方式,簡單方便,適用於中繼資料能夠用數字表述或者原資料具有鮮明循序關聯性的情形。
b)數字分析法:
  有這樣一組資料,用於表述一些人的出生日期
75 10
75 12 10
75 02 14
分析一下,年和月的第一位元字基本相同,造成衝突的幾率非常大,而後面三位差別比較大,所以採用後三位
c)平方取中法
 取關鍵字平方後的中間幾位作為雜湊地址
d) 摺疊法:
 將關鍵字分割成位元相同的幾部分,最後一部分位元可以不相同,然後去這幾部分的疊加和(取出進位)作為雜湊地址,比如有這樣的資料20-1445-4547-3
可以
        5473
+      4454
+        201
=    10128
取出進位1,取0128為雜湊地址
e)取餘法
取關鍵字被某個不大於雜湊表表長m的數p除後所得餘數為雜湊地址。H(key)=key MOD p (p<=m)
f) 隨機數法
 選擇一個隨機函數,取關鍵字的隨機函數值為它的雜湊地址,即H(key)=random(key) ,其中random為隨機函數。通常用於關鍵字長度不等時採用此法。

總之,雜湊函數的規則是:通過某種轉換關係,使關鍵字適度的分散到指定大小的的順序結構中。越分散,則以後尋找的時間複雜度越小,空間複雜度越高。


2)使用hash,我們付出了什麼。


hash是一種典型以空間換時間的演算法,比如原來一個長度為100的數組,對其尋找,只需要遍曆且匹配相應記錄即可,從空間複雜度上來看,假如數組儲存的是byte類型資料,那麼該數組佔用100byte空間。現在我們採用hash演算法,我們前面說的hash必須有一個規則,約束鍵與儲存位置的關係,那麼就需要一個固定長度的hash表,此時,仍然是100byte的數組,假設我們需要的100byte用來記錄鍵與位置的關係,那麼總的空間為200byte

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.