哈希是什么?為什么哈希存取比較快?


  不太恰當的比喻:
    XM 指的是“小明”,也指的是“小萌”
    XM就是哈希值,小明和小萌就是擁有同一個哈希值的,存在同一個鏈表的元素。
    想要獲取小萌,首先使用hashcode獲取到這兩個人,然后再通過equals獲取到小萌。
  個人理解

  

  哈希表其實就是一個一維數組,而數組中的每一個元素都是一個單向鏈表而已。這樣的數據結構解決了數組的增刪元素的不足和鏈表的查詢效率的不足

  數組是存在連續的存儲空間,而鏈表的存儲空間不連續
--------------------------------
  哈希算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨后的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的,所以數據的哈希值可以檢驗數據的完整性。
  哈希表是根據設定的哈希函數H(key)和處理沖突方法將一組關鍵字映象到一個有限的地址區間上,並以關鍵字在地址區間中的象作為記錄在表中的存儲位置,這種表稱為哈希表或散列,所得存儲位置稱為哈希地址或散列地址。作為線性數據結構與表格和隊列等相比,哈希表無疑是查找速度比較快的一種。
  哈希通過將單向數學函數(有時稱為“哈希算法”)應用到任意數量的數據所得到的固定大小的結果。如果輸入數據中有變化,則哈希也會發生變化。哈希可用於許多操作,包括身份驗證和數字簽名。也稱為“消息摘要”。
--------------------------------
  原來hash是一個短的key值,來代替原有的對象,這樣查詢的效率就會高非常多的倍數。
  也可以用在通信方面,比如兩個系統有相同的hash函數,這樣就不需要傳遞大的對象,只需要傳遞hash值給對方,然后,對方在根據hash函數本地計算出對象。
  覺得很棒。
--------------------------------
  哈希算法存取之所以快,是因為其 直接通過關鍵字key得到要存取的記錄內存存儲位置

  試想這樣的場景,你很想學太極拳,聽說學校有個叫張三豐的人打得特別好,於是你到學校學生處找人,學生處的工作人員可能會拿出學生名單,一個一個的查找,最終告訴你,學校沒這個人,並說張三豐幾百年前就已經在武當山作古了。可如果你找對了人,比如在操場上找那些愛運動的同學,人家會告訴你,"哦,你找張三豐呀,有有有,我帶你去。於是他把你帶到了體育館內,並告訴你,那個教大家打太極的小伙子就是張三豐',原來"張三豐.是因為他太極拳打得好而得到的外號。學生處的老師找張三豐,那就是順序表查找,依賴的是姓名關鍵字的比較。而通過愛好運動的同學詢問時,沒有遍歷,沒有比較,就憑他們"欲找太極'張三豐',必在體育館當中"的經驗,直接告訴你位置。

  也就是說,我們只需要通過某個函數f,使得

    存儲位置=f (關鍵字)

  那樣我們可以通過查找關鍵字不需要比較就可獲得需要的記錄的存儲位置。這就是一種新的存儲技術一一散列技術(哈希算法)。

  散列技術是在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關系f,使得每個關鍵字key 對應一個存儲位置f (key)。查找時,根據這個確定的對應關系找到給定值key 的映射f (key) ,若查找集合中存在這個記錄,則必定在f (key) 的位置上。
  這里我們把這種對應關系f 稱為散列函數, 又稱為哈希(Hash) 函數。按這個思想,采用散列技術將記錄存儲在一塊連續的存儲空間中,這塊連續存儲空間稱為散列表或哈希表(Hash table)。 那么關鍵字對應的記錄存儲位置我們稱為散列地址。

  散列表是個一維數組,是連續的,而散列地址是不連續的

  整個散列過程其實就是兩步。
    (1) 在存儲時,通過散列函數計算記錄的散列地址,並按此散列地址存儲該記錄。
    (2) 當查找記錄時,我們通過同樣的散列函數計算記錄的散列地址,按此散列地址訪問該記錄。由於存取用的是同一個散列函數, 因此結果當然也是相同的。

  所以說,散列技術既是一種存儲方法,也是一種查找方法。然而它與線性表、樹、圖等結構不同的是,前面幾種結構,數據元素之間都存在某種邏輯關系,可以用連線圖示表示出來,而散列技術的記錄之間不存在什么邏輯關系,它只與關鍵字有關聯。因此,散列主要是面向查找的存儲結構。

  我們時常會碰到兩個關鍵字key1 != key2,但是卻有f(key1) = f(key2),這種現象我們稱為哈希沖突,如果沒有哈希沖突,散列表是一種非常高效的查找數據結構,其時間復雜度為O(1);
  所以說,實際上哈希算法的時間復雜度並沒有O(1)
--------------------------------
  為什么哈希存取比較快呢,很簡單啦,因為有種算法叫做哈希算法,哈希算法會根據你要存入的數據,先通過該算法,計算出一個地址值,這個地址值就是你需要存入到集合當中的數據的位置,而不會像數組那樣一個個的進行挨個存儲,挨個遍歷一遍后面有空位就存這種情況了,而你查找的時候,也是根據這個哈希算法來的,將你的要查找的數據進行計算,得出一個地址,這個地址會印射到集合當中的位置,這樣就能夠直接到這個位置上去找了,而不需要像數組那樣,一個個遍歷,一個個對比去尋找,這樣自然增加了速度,提高了效率了.

--------------------------------
  因為哈希是常數的時間復雜度啊,不管數據量是大還是小,只要用一個固定的算法算出哈希值就能直接找到結果。
--------------------------------
  哈希是個人名,也是一個算法的名稱。
  哈希算法是數據查找技術中最經典的算法之一。
  用哈希算法建立索引值,加快查詢速度。
--------------------------------
  最最簡單易懂的說法就是,hash算法將你傳入的key運算成一個地址值,類似指針那樣,指向內存中的某塊區域,存的時候根據該地址值,將value存到這個地址值映射的內存區域里,取得時候從key作hash運算后得出的地址值所對應的內存區域中取出結果;
--------------------------------
  自己的理解:哈希一般是基於數組的,只要知道數組的下表,就可以很快的存取該元素。
  通過對元素的一個關鍵字,在通過一個函數,把這個關鍵字轉換成數組的下標,這個函數就是哈希函數。
  這樣,就能通過關鍵字很快的存取元素。
  有時候會發生沖突現象,即不同的關鍵字,通過哈希函數算出的結果是一樣的,這時候就可以用線性探測或者連地址法等來解決。
  在使用哈希的時候,要考慮你存的數據個數的大小,然后再確定數組的大小,一般數組的大小是數據個數的兩倍(好像)。具體為什么就不是特別清楚了。。。。
--------------------------------
  你好,哈希存儲基於一種映射關系的存儲,實現這種映射關系的是哈希函數H(key)(這個函數按一定的標准可以自己設定),由節點的關鍵碼key值決定節點的存儲地址,然后直接由key值存儲或查找數據,查找數據的時間復雜度為O(1)。所以查找的速度非常飛,畢竟時間復雜度為O(n),順序存儲查找的時間復雜度為O(n)。
--------------------------------

  參考CSDN博客


免責聲明!

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



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