青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計

最新評論

【ZT】哈希的原理和代價

哈希表和哈希函數(shù)是大學(xué)數(shù)據(jù)結(jié)構(gòu)中的課程,實際開發(fā)中我們經(jīng)常用到Hashtable這種結(jié)構(gòu),當(dāng)遇到鍵-值對存儲,采用Hashtable比ArrayList查找的性能高。為什么呢?我們在享受高性能的同時,需要付出什么代價,那么使用Hashtable是否就是一樁無本萬利的買賣呢?就此疑問,做以下分析,希望能拋磚引玉。

1)hash它為什么對于鍵-值查找性能高 

學(xué) 過數(shù)據(jù)結(jié)構(gòu)的,都應(yīng)該曉得,線性表和樹中,記錄在結(jié)構(gòu)中的相對位置是隨機的,記錄和關(guān)鍵字之間不存在明確的關(guān)系,因此在查找記錄的時候,需要進行一系列的 關(guān)鍵字比較,這種查找方式建立在比較的基礎(chǔ)之上,在.net中(Array,ArrayList,List)這些集合結(jié)構(gòu)采用了上面的存儲方式。
比如,現(xiàn)在我們有一個班同學(xué)的數(shù)據(jù),包括姓名,性別,年齡,學(xué)號等。假如數(shù)據(jù)有

姓名性別年齡學(xué)號
張三151
李四142
王五143

假如,我們按照姓名來查找,假設(shè)查找函數(shù)FindByName(string name);

1)查找“張三”
只需在第一行匹配一次。
2)查找"王五"
    在第一行匹配,失敗,
    在第二行匹配,失敗,
    在第三行匹配,成功

上面兩種情況,分別分析了最好的情況,和最壞的情況,那么平均查找次數(shù)應(yīng)該為 (1+3)/2=2次,即平均查找次數(shù)為(記錄總數(shù)+1)的1/2。
盡管有一些優(yōu)化的算法,可以使查找排序效率增高,但是復(fù)雜度會保持在log2n的范圍之內(nèi)。

如 何更更快的進行查找呢?我們所期望的效果是一下子就定位到要找記錄的位置之上,這時候時間復(fù)雜度為1,查找最快。如果我們事先為每條記錄編一個序號,然后 讓他們按號入位,我們又知道按照什么規(guī)則對這些記錄進行編號的話,如果我們再次查找某個記錄的時候,只需要先通過規(guī)則計算出該記錄的編號,然后根據(jù)編號, 在記錄的線性隊列中,就可以輕易的找到記錄了 。

注意,上述的描述包含了兩個概念,一個是用于對學(xué)生進行編號的規(guī)則,在數(shù)據(jù)結(jié)構(gòu)中,稱之為哈希函數(shù),另外一個是按照規(guī)則為學(xué)生排列的順序結(jié)構(gòu),稱之為哈希表。

仍以上面的學(xué)生為例,假設(shè)學(xué)號就是規(guī)則,老師手上有一個規(guī)則表,在排座位的時候也按照這個規(guī)則來排序,查找李四,首先該教師會根據(jù)規(guī)則判斷出,李四的編號為2,就是在座位中的2號位置,直接走過去,“李四,哈哈,你小子,就是在這!”

看看大體流程: 


從上面的圖中,可以看出哈希表可以描述為兩個筒子,一個筒子用來裝記錄的位置編號,另外一個筒子用來裝記錄,另外存在一套規(guī)則,用來表述記錄與編號之間的聯(lián)系。這個規(guī)則通常是如何制定的呢?

a)直接定址法:

    我在前一篇文章對GetHashCode()性能比較的問題中談到,對于整形的數(shù)據(jù)GetHashCode()函數(shù)返回的就是整形   本身,其實就是基于直接定址的方法,比如有一組0-100的數(shù)據(jù),用來表示人的年齡

那么,采用直接定址的方法構(gòu)成的哈希表為:

012345
0歲1歲2歲3歲4歲5歲

.....
這樣的一種定址方式,簡單方便,適用于元數(shù)據(jù)能夠用數(shù)字表述或者原數(shù)據(jù)具有鮮明順序關(guān)系的情形。

b)數(shù)字分析法:

   有這樣一組數(shù)據(jù),用于表述一些人的出生日期

7510
751210
750214

分析一下,年和月的第一位數(shù)字基本相同,造成沖突的幾率非常大,而后面三位差別比較大,所以采用后三位

c)平方取中法
 取關(guān)鍵字平方后的中間幾位作為哈希地址

d) 折疊法:
 將關(guān)鍵字分割成位數(shù)相同的幾部分,最后一部分位數(shù)可以不相同,然后去這幾部分的疊加和(取出進位)作為哈希地址,比如有這樣的數(shù)據(jù)20-1445-4547-3
可以
         5473
+       4454
+         201
=     10128
取出進位1,取0128為哈希地址

e)取余法
取關(guān)鍵字被某個不大于哈希表表長m的數(shù)p除后所得余數(shù)為哈希地址。H(key)=key MOD p (p<=m)

f) 隨機數(shù)法
 選擇一個隨機函數(shù),取關(guān)鍵字的隨機函數(shù)值為它的哈希地址,即H(key)=random(key) ,其中random為隨機函數(shù)。通常用于關(guān)鍵字長度不等時采用此法。

總之,哈希函數(shù)的規(guī)則是:通過某種轉(zhuǎn)換關(guān)系,使關(guān)鍵字適度的分散到指定大小的的順序結(jié)構(gòu)中。越分散,則以后查找的時間復(fù)雜度越小,空間復(fù)雜度越高。

2)使用hash,我們付出了什么?

hash 是一種典型以空間換時間的算法,比如原來一個長度為100的數(shù)組,對其查找,只需要遍歷且匹配相應(yīng)記錄即可,從空間復(fù)雜度上來看,假如數(shù)組存儲的是 byte類型數(shù)據(jù),那么該數(shù)組占用100byte空間。現(xiàn)在我們采用hash算法,我們前面說的hash必須有一個規(guī)則,約束鍵與存儲位置的關(guān)系,那么就 需要一個固定長度的hash表,此時,仍然是100byte的數(shù)組,假設(shè)我們需要的100byte用來記錄鍵與位置的關(guān)系,那么總的空間為 200byte,而且用于記錄規(guī)則的表大小會根據(jù)規(guī)則,大小可能是不定的,比如在lzw算法中,如果一個很長的用于記錄像素的byte數(shù)組,用來記錄位置 與鍵關(guān)系的表空間,算法推薦為一個12bit能表述的整數(shù)大小,那么足夠長的像素數(shù)組,如何分散到這樣定長的表中呢,lzw算法采用的是可變長編碼,具體 會在深入介紹lzw算法的時候介紹。

注:hash表最突出的問題在于沖突,就是兩個鍵值經(jīng)過哈希函數(shù)計算出來的索引位置很可能相同,這個問題,下篇文章會令作闡述。
注:之所以會簡單得介紹了hash,是為了更好的學(xué)習(xí)lzw算,學(xué)習(xí)lzw算法是為了更好的研究gif文件結(jié)構(gòu),最后,我將詳細(xì)的闡述一下gif文件是如何構(gòu)成的,如何高效操作此種類型文件。 

posted on 2009-06-04 13:34 大龍 閱讀(254) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            91久久精品久久国产性色也91| 噜噜噜91成人网| 国产欧美精品| 国产视频欧美| 在线观看欧美亚洲| 亚洲欧洲精品成人久久奇米网| 亚洲国产精品日韩| 亚洲精品五月天| 亚洲欧美国产制服动漫| 亚洲综合色网站| 久久九九电影| 欧美激情精品久久久久| 亚洲日本中文字幕免费在线不卡| 欧美激情一区在线| 国产精品国产三级国产专区53| 欧美一区二区三区久久精品茉莉花| 亚洲精品乱码久久久久久日本蜜臀| 亚洲麻豆av| 久久亚洲图片| 91久久在线| 午夜精品久久久久| 欧美黄色免费网站| 国产精品推荐精品| 亚洲精选在线| 麻豆91精品| 亚洲天堂成人| 欧美国产1区2区| 在线精品亚洲| 亚洲高清不卡在线观看| 在线亚洲欧美| 久久精品国产清自在天天线| 亚洲第一精品久久忘忧草社区| 99精品免费视频| 久久先锋影音| 国产精品美女久久久久av超清 | 国产精品色午夜在线观看| 韩国av一区二区三区四区| 一区二区不卡在线视频 午夜欧美不卡在 | 国产美女精品视频免费观看| 曰韩精品一区二区| 香蕉久久夜色精品国产| 亚洲福利国产精品| 久久精品综合| 国产亚洲一区二区三区| 中日韩午夜理伦电影免费| 蜜臀a∨国产成人精品| 亚洲一区观看| 国产精品久久久久久久久久免费 | 99精品视频一区二区三区| 久久综合色影院| 影音先锋一区| 久久亚洲二区| 久久精品日韩欧美| 国产一区在线看| 久久麻豆一区二区| 久久精品盗摄| 黑丝一区二区| 免费日韩av| 免费欧美在线视频| 日韩一级黄色大片| 亚洲伦伦在线| 国产精品一区久久久久| 羞羞答答国产精品www一本| 中文国产成人精品| 国产精品一卡二| 欧美一区在线看| 午夜欧美精品| **网站欧美大片在线观看| 免费视频一区| 欧美精品成人一区二区在线观看| 亚洲国产日韩在线一区模特| 欧美激情国产日韩精品一区18| 欧美~级网站不卡| 99精品欧美一区| 一区二区欧美在线观看| 国产精品伦理| 欧美不卡在线| 欧美日韩国产成人高清视频| 亚洲综合精品四区| 欧美亚洲在线播放| 亚洲第一区色| 亚洲毛片网站| 国产亚洲欧美一区| 欧美激情在线| 国产精品你懂的在线欣赏| 久久久国产91| 欧美日韩和欧美的一区二区| 先锋亚洲精品| 麻豆国产精品777777在线| 亚洲一区二区三区四区五区黄| 亚洲欧美精品一区| 亚洲激情网址| 午夜国产欧美理论在线播放| 亚洲国产91| 亚洲网址在线| 免费成人在线视频网站| 亚洲黄色免费| 99视频精品全部免费在线| 国产精品久久久久三级| 免费亚洲电影在线| 国产精品久久久一区二区| 久久综合色影院| 欧美视频一区在线| 免费精品视频| 国产美女精品视频免费观看| 亚洲国产精品久久久久| 国产乱码精品| 日韩一区二区免费看| 国内精品久久久久久| 一个人看的www久久| 亚洲第一主播视频| 欧美一区二区三区播放老司机| 一本色道久久综合亚洲精品小说| 欧美与黑人午夜性猛交久久久| 亚洲乱码国产乱码精品精可以看| 久久国产加勒比精品无码| 亚洲欧美电影院| 欧美日韩精品中文字幕| 欧美国产综合视频| 激情五月***国产精品| 亚洲一区观看| 亚洲欧美美女| 欧美婷婷六月丁香综合色| 欧美福利视频在线观看| 国产一区二区三区高清播放| 亚洲深夜福利在线| 亚洲少妇中出一区| 欧美区日韩区| 亚洲日本一区二区三区| 亚洲人精品午夜| 男女激情久久| 亚洲国产成人精品女人久久久 | 亚洲人体1000| 老鸭窝91久久精品色噜噜导演| 久久人人97超碰国产公开结果 | 亚洲激情专区| 亚洲欧洲精品一区二区精品久久久| 久久九九全国免费精品观看| 久久久久久电影| 国内免费精品永久在线视频| 亚欧成人精品| 久久综合999| 在线看片成人| 免费亚洲电影在线| 亚洲国产乱码最新视频| 亚洲精品国产精品乱码不99| 欧美粗暴jizz性欧美20| 亚洲黄色一区| 亚洲一区二区在线看| 国产精品裸体一区二区三区| 亚洲永久在线观看| 麻豆精品视频在线| 国产精品视屏| 国产手机视频精品| 欧美第一黄色网| 亚洲精品日本| 欧美区一区二区三区| 亚洲免费电影在线观看| 亚洲女性喷水在线观看一区| 国产精品青草综合久久久久99 | 欧美国产成人在线| 亚洲精品视频在线播放| 欧美日本高清一区| 亚洲一区二区三区激情| 久久久久一区二区三区| 亚洲欧洲三级| 国产精品综合视频| 另类专区欧美制服同性| 日韩一区二区久久| 久久亚洲国产精品一区二区| 亚洲精品国产精品国自产观看浪潮| 欧美日韩一区国产| 欧美怡红院视频| 亚洲日本激情| 久久久国产精品一区| 亚洲精品久久久久| 国产精品一区二区三区四区五区| 久久久久欧美| 亚洲视频中文字幕| 欧美激情一区二区三区四区| 亚洲欧美日韩国产另类专区| 精品电影在线观看| 国产精品亚洲а∨天堂免在线| 另类成人小视频在线| 亚洲欧美视频一区| 日韩视频三区| 欧美黄色小视频| 久久免费少妇高潮久久精品99| 一区二区三区视频免费在线观看| 国内一区二区三区| 国产精品一区久久久久| 欧美日韩在线第一页| 欧美 日韩 国产一区二区在线视频 | 一区二区在线观看视频| 欧美亚州在线观看| 欧美激情无毛| 免费观看成人www动漫视频| 亚洲欧美日韩一区二区| 99这里只有久久精品视频| 欧美激情视频在线播放|