數據結構之------什么是哈希表?(哈希表是一個以空間換取時間的數據結構!!! 加快查找速度!!!)


結合http://www.cnblogs.com/feichengwulai/articles/3523905.html這篇文章一起記憶!!!

@哈希表的實際應用

1,Sql中的索引,就是通過哈希表實現的。加大了數據存儲空間,但查詢速度快了很多!!!

---具體可以查哈希表的應用!!!

 

@什么是哈希表?

1,google搜索到的頭條

  散列表也叫哈希表),是根據關鍵碼值直接進行訪問的數據結構,也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數存放記錄的數組叫做散列表
     我覺得這個解釋太含糊,想要整明白哈希表,那就得明白哈希表到底有什么樣的優勢。
     數據結構中,有個時間算法復雜度O(n)的概念來衡量某種算法在時間效率上的優劣哈希表的理想算法復雜度為O(1),也就是說利用哈希表查找某個值,系統所使用的時間在理想情況下為定值,這就是它的優勢那么哈希表是如何做到這一點的呢?
     我們定義一個很大的有序數組,想要得到位於該數組第n個位置的值,它的算法復雜度為O(1)。哈希表利用哈希函數將需要存儲的內容的關鍵值轉換為這個有序數組中的某個值在被存儲內容和有序數組之間建立了映射關系。這樣,下次我們對這個值進行查找時只要使用同一個哈希函數對關鍵值進行轉換,找到這個數組值就可以了。
      如果還沒有明白是怎么回事的話,那我們來舉個例子。假設我們要做個存儲結構,需要存儲下來三國中的人物,以及他們的詳細信息。我們用他們的名字來作為存儲 的關鍵值,例如:劉備,曹操,孫權,關羽,張飛……等等。這個時候我們如果想用一般的方法來查找這些英雄豪傑,需要遍歷整個存儲空間,如果這些英雄豪傑一 共有n個,那么這時候的時間算法復雜度為O(n)顯然如果n值很大,每次想要找到某個英雄就需要比較長的時間。
      此時我們先定義一個大的有序結構數組HashValue[m]用來存放各位英雄豪傑的信息(value值,劉備,曹操...等信息)。然后編寫一個哈希函數ChangeToHashValue (name),函數的具體內容就不細說了,反正這個函數會將這些做為關鍵值的名字轉換為HashValue[m]中的某個下標值x然后可以將英雄的信息放進HashValue[x]中去。這樣,可以將所有英雄的信息存儲起來。當查詢的時候再使用哈希函數ChangeToHashValue(name)得到這個下標值,這樣就很容易得到了這個英雄的信息例如:ChangeToHashValue(劉備)為10,那么就將劉備存儲到HashValue [10]里面當查詢的時候再次使用ChangeToHashValue(劉備)得到10,這個時候我們就可以很容易找到劉備的所有信息。在實際應用中如 果我們想把所有的英雄豪傑都存儲進系統時,需要定義m>n。就是數組的大小要大於需要存儲的信息量,所以說哈希表是一個以空間換取時間的數據結構
      這個時候問題來了,出現了這種情況ChangeToHashValue(關羽)和ChangeToHashValue(張飛)得到的值是一樣的,都是250,我們豈不是在存儲過程中會遇到麻煩,怎么安排他們二位的地方呢(總不能讓二位打一架,誰贏了誰呆在那吧),這就需要一個解決沖突的方法。當遇到這 種情況時我們可以這樣處理,先存儲好了關羽,當張飛進入系統時會發現關羽已經是250了,那咱就加一位,251得了,這不就解決了。我們查找張飛的時候也 是,一看250不是張飛,那就加個1,就找到了。這時還存在一個問題。直接用ChangeToHashValue(趙雲)為251,張飛已經早早占了他的 地方,那就再加1存到252唄。呵呵,這時我們會發現,當哈希函數沖突發生的機率很高時,可能會有一群英雄豪傑在250這個值后面扎堆排隊。要命的是查找 的時候,時間算法復雜度早已不是O(1)了(所以我們說理想情況下哈希表的時間算法復雜度為O(1))。     

  這就是說哈希函數的編寫哈希表的一個關鍵問題,會涉及到一個存儲值在哈希表中的統計分布。如果哈希函數已經定義好了,沖突的解決就成為了改變系統性能的關鍵因素。其實還有很多種方法來解決沖突情況下的存儲和查找問題,不一定非要線性向后排隊,如果有好的哈希表沖突的解決方法也能很大程度上提高系統的效 率。
      好了,寫到這里,哈希表的概念應該搞清楚了吧。今天咱這也是現學現賣,其實我還沒有使用過這個數據結構。有不對的地方還請高手指出來,耽誤了我自己不怕,免得誤導了別人

 

@總結:

1,哈希表,就是聲明一個數組來存放value值(存儲的內容),然后聲明一個哈希函數,哈希表利用哈希函數將需要存儲的內容的關鍵值轉換為這個有序數組中的某個值被存儲內容有序數組之間建立了映射關系,這樣,下次我們對這個值進行查找時只要使用同一個哈希函數存儲的內容的關鍵值進行轉換,找到這個數組值就可以了。

@值---hash表是一種映射關系,查找值時,先將值經過hash計算,計算后的值在hash表中查找,查找到了,就找到了對應的值。

2,前提是將所有存儲的內容計算成唯一的hash值,這樣對比才有效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM