程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 為何哈希存取比擬快?應用它須要支付甚麼價值

為何哈希存取比擬快?應用它須要支付甚麼價值

編輯:C#入門知識

為何哈希存取比擬快?應用它須要支付甚麼價值。本站提示廣大學習愛好者:(為何哈希存取比擬快?應用它須要支付甚麼價值)文章只能為提供參考,不一定能成為您想要的結果。以下是為何哈希存取比擬快?應用它須要支付甚麼價值正文


  哈希表和哈希函數是年夜學數據構造中的課程,現實開辟中我們常常用到Hashtable這類構造,當碰到鍵-值對存儲,采取Hashtable比ArrayList查找的機能高。為何呢?我們在享用高機能的同時,須要支付甚麼價值(這幾天看紅頂商人胡雪巖,經典台詞:在你享用這之前,必需受他人吃不了的苦,忍耐他人受不了的辱沒),那末應用Hashtable能否就是一樁無本萬利的生意呢?就此疑問,做以下剖析,願望能拋磚引玉。

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 1 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,並且用於記載規矩的表年夜小會依據規矩,年夜小能夠是不定的,好比在lzw算法中,假如一個很長的用於記載像素的byte數組,用來記載地位與鍵關系的表空間,算法推舉為一個12bit能表述的整數年夜小,那末足夠長的像素數組,若何疏散到如許定長的表中呢,lzw算法采取的是可變長編碼,詳細會在深刻引見lzw算法的時刻引見。

注:hash表最凸起的成績在於抵觸,就是兩個鍵值經由哈希函數盤算出來的索引地位極可能雷同,這個成績,下篇文章會令作論述。

注:之所以會簡略得引見了hash,是為了更好的進修lzw算法,進修lzw算法是為了更好的研討gif文件構造,最初,我將具體的論述一下gif文件是若何組成的,若何高效操作此品種型文件。

以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved