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

elva

談?wù)?Hash Table

轉(zhuǎn)自:
http://geeklu.com/2010/07/hash-table/

 

一.數(shù)據(jù)結(jié)構(gòu)

在我們編程的世界里數(shù)據(jù)的基本組織可以說有三種形式。

  1. 結(jié)構(gòu)體(或?qū)ο?
  2. 數(shù)組
  3. 鏈表

其他任何的數(shù)據(jù)組織形式都可以看作是這三種數(shù)據(jù)組織形式的組合變體。

結(jié)構(gòu)體(或?qū)ο?可以是基本數(shù)據(jù)類型或者其他結(jié)構(gòu)體(或?qū)ο?的組合。結(jié)構(gòu)體或?qū)ο笠话阌脕砻枋鲆粋€(gè)復(fù)雜數(shù)據(jù)實(shí)體。

數(shù)組一般是一組同類型的變量的集合,在內(nèi)存中表現(xiàn)為一片連續(xù)的空間,因?yàn)榭臻g是連續(xù)的,且每一個(gè)數(shù)據(jù)單元占的內(nèi)存空間的大小是相等的,所以可以根據(jù)地址的偏移對(duì)數(shù)據(jù)元素實(shí)現(xiàn)快速訪問,但是當(dāng)需要插入或者刪除一個(gè)元素的時(shí)候,則需要對(duì)目標(biāo)元素的之后的所有元素進(jìn)行移動(dòng)了。

鏈表的單個(gè)節(jié)點(diǎn)一般為結(jié)構(gòu)體或者對(duì)象,因?yàn)殒湵淼膯蝹€(gè)節(jié)點(diǎn)除了需要保存數(shù)據(jù)之外還需要維護(hù)它的相鄰節(jié)點(diǎn)的關(guān)系,如果想獲得鏈表中的某個(gè)節(jié)點(diǎn)的值,需要從鏈表的頭結(jié)點(diǎn)開始遍歷,直到找到需要的東西,而插入或者刪除某個(gè)節(jié)點(diǎn)的話,需要找到相應(yīng)的節(jié)點(diǎn),修改其以及其相鄰節(jié)點(diǎn)的相關(guān)指針的引用即可。

像其他的數(shù)據(jù)結(jié)構(gòu),比如 隊(duì)列,棧,樹,都可以通過數(shù)組或者鏈表來組織,并實(shí)現(xiàn)相應(yīng)的操作功能。

二.Hash Table

這個(gè)世界上沒有十全十美的東西,所以我們要學(xué)會(huì)取舍。任何技術(shù)的實(shí)現(xiàn)都沒有最好的只要最合適的,也就說實(shí)現(xiàn)的最佳方案是和應(yīng)用場(chǎng)景息息相關(guān)的。
很多時(shí)候,我們想對(duì)數(shù)據(jù)進(jìn)行快速的存取(比如緩存的實(shí)現(xiàn)),并用一個(gè)key來標(biāo)記自己存取的數(shù)據(jù)。我們可以把它叫做key-value的結(jié)構(gòu)。
說到“快速”我們很快想到數(shù)組,因?yàn)閿?shù)組可以在O(1)的時(shí)間復(fù)雜內(nèi)完成指定位置元素的讀寫操作。
所以在理想狀態(tài),如果一個(gè)數(shù)組足夠長,且存在一個(gè)函數(shù)可以將每一個(gè)key映射到唯一的一個(gè)數(shù)組下標(biāo),那么我們就可以很完美的解決問題。但往往資源都是有限的,我們沒有那么大的空間,也不能設(shè)計(jì)一個(gè)無比負(fù)責(zé)的映射算法保證每一個(gè)key對(duì)應(yīng)到一個(gè)唯一的數(shù)組下標(biāo)。所以我們會(huì)選擇一些折中的方案。

hash table便是為解決這類問題而存在的。

1.哈希函數(shù)

Hash或者你可以翻譯成散列或者雜湊,hash操作其本質(zhì)上就是將一個(gè)數(shù)據(jù)映射成另一個(gè)數(shù)據(jù),通常情況下原數(shù)據(jù)的長度比hash后的數(shù)據(jù)容量大。
這種映射的關(guān)系我們叫做哈希函數(shù)。

一般情況下 哈希函數(shù)的輸入可能的總數(shù)要遠(yuǎn)遠(yuǎn)多于哈希值所能表示的總數(shù),所以就有可能兩個(gè)不同的輸入對(duì)應(yīng)同一個(gè)哈希值,通常把具有不同關(guān)鍵碼而具有相同哈希值的記錄稱作“同義詞”。
在信息安全領(lǐng)域中也經(jīng)常使用到哈希函數(shù),不過需要使用的是單向哈希函數(shù),就是無法通過哈希的結(jié)果反推出輸入,所以經(jīng)常應(yīng)用于密碼的加密,傳輸內(nèi)容的完整性檢查,在安全領(lǐng)域常用的哈希算法有 MD5,SHA1等。
在哈希表的應(yīng)用中,哈希函數(shù)常用余數(shù)法進(jìn)行,也就是通過求模的方式算出哈希值。

2.哈希表

哈希表是一種數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)key-value的快速存取。之前說過數(shù)組可以實(shí)現(xiàn)快速存取,所以哈希表肯定會(huì)使用到數(shù)組。在這里,我們把每一個(gè)數(shù)組的單元叫做一個(gè)bucket(桶)。

構(gòu)造哈希函數(shù)

這里哈希函數(shù)的作用就是將key映射到一個(gè)存儲(chǔ)地址。所以構(gòu)造一個(gè)哈希表我們得先構(gòu)造哈希函數(shù)。
如果一個(gè)key哈希后對(duì)應(yīng)地址中已經(jīng)存放了值了,這種情況我們叫做哈希沖突(Hash collisions)。
如果存在一個(gè)哈希函數(shù),使得每一個(gè)輸入都能對(duì)應(yīng)到唯一的一個(gè)存儲(chǔ)單元中(沒有沖突),那么這樣的哈希函數(shù)我們可以叫它完美哈希函數(shù)(Perfect Hash Function,簡(jiǎn)稱PHF)。
但為了哈希函數(shù)簡(jiǎn)單,運(yùn)行速度快,往往不會(huì)使用完美哈希函數(shù)。所以沖突肯定會(huì)存在的,為了減少?zèng)_突,我們希望哈希函數(shù)的結(jié)果均勻的分布在地址單元的空間中。這樣可以有效的減少?zèng)_突。

裝填因子Load factor a=哈希表的實(shí)際元素?cái)?shù)目(n)/ 哈希表的容量(m) a越大,哈希表沖突的概率越大,但是a越接近0,那么哈希表的空間就越浪費(fèi)。
一般情況下建議Load factor的值為0-0.7,Java實(shí)現(xiàn)的HashMap默認(rèn)的Load factor的值為0.75,當(dāng)裝載因子大于這個(gè)值的時(shí)候,HashMap會(huì)對(duì)數(shù)組進(jìn)行擴(kuò)張至原來兩倍大。

沖突解決

既然沖突不可避免,那么我們就必須對(duì)沖突進(jìn)行解決(總不能把之前的內(nèi)容覆蓋掉把),
解決沖突的方式主要分兩類
開放定址法(Open addressing)這種方法就是在計(jì)算一個(gè)key的哈希的時(shí)候,發(fā)現(xiàn)目標(biāo)地址已經(jīng)有值了,即發(fā)生沖突了,這個(gè)時(shí)候通過相應(yīng)的函數(shù)在此地址后面的地址去找,直到?jīng)]有沖突為止。這個(gè)方法常用的有線性探測(cè),二次探測(cè),再哈希。
這種解決方法有個(gè)不好的地方就是,當(dāng)發(fā)生沖突之后,會(huì)在之后的地址空間中找一個(gè)放進(jìn)去,這樣就有可能后來出現(xiàn)一個(gè)key哈希出來的結(jié)果也正好是它放進(jìn)去的這個(gè)地址空間,這樣就會(huì)出現(xiàn)非同義詞的兩個(gè)key發(fā)生沖突。


鏈接法(Separate chaining)鏈接法是通過數(shù)組和鏈表組合而成的。當(dāng)發(fā)生沖突的時(shí)候只要將其加到對(duì)應(yīng)的鏈表中即可。

與開放定址法相比,鏈接法有如下幾個(gè)優(yōu)點(diǎn):
①鏈接法處理沖突簡(jiǎn)單,且無堆積現(xiàn)象,即非同義詞決不會(huì)發(fā)生沖突,因此平均查找長度較短;
②由于鏈接法中各鏈表上的結(jié)點(diǎn)空間是動(dòng)態(tài)申請(qǐng)的,故它更適合于造表前無法確定表長的情況;
③開放定址法為減少?zèng)_突,要求裝填因子α較小,故當(dāng)結(jié)點(diǎn)規(guī)模較大時(shí)會(huì)浪費(fèi)很多空間。而鏈接法中可取α≥1,且結(jié)點(diǎn)較大時(shí),拉鏈法中增加的指針域可忽略不計(jì),因此節(jié)省空間;
④在用鏈接法構(gòu)造的散列表中,刪除結(jié)點(diǎn)的操作易于實(shí)現(xiàn)。只要簡(jiǎn)單地刪去鏈表上相應(yīng)的結(jié)點(diǎn)即可。而對(duì)開放地址法構(gòu)造的散列表,刪除結(jié)點(diǎn)不能簡(jiǎn)單地將被刪結(jié)點(diǎn)的空間置為空,否則將截?cái)嘣谒筇钊松⒘斜淼耐x詞結(jié)點(diǎn)的查找路徑。這是因?yàn)楦鞣N開放地址法中,空地址單元(即開放地址)都是查找失敗的條件。因此在 用開放地址法處理沖突的散列表上執(zhí)行刪除操作,只能在被刪結(jié)點(diǎn)上做刪除標(biāo)記,而不能真正刪除結(jié)點(diǎn)。

當(dāng)然鏈接法也有其缺點(diǎn),拉鏈法的缺點(diǎn)是:指針需要額外的空間,故當(dāng)結(jié)點(diǎn)規(guī)模較小時(shí),開放定址法較為節(jié)省空間,而若將節(jié)省的指針空間用來擴(kuò)大散列表的規(guī)模,可使裝填因子變小,這又減少了開放定址法中的沖突,從而提高平均查找速度。


注:部分圖片來自Wikipedia

posted on 2010-10-25 12:57 葉子 閱讀(4177) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产乱子伦一区二区三区国色天香| 亚洲激情在线视频| 精品粉嫩aⅴ一区二区三区四区| 欧美午夜精品电影| 国产欧美视频一区二区| 国产精品久久久久久久久久三级 | 欧美刺激性大交免费视频 | 韩国视频理论视频久久| 国产亚洲欧美中文| 亚洲黄色成人| 亚洲视频网站在线观看| 欧美一区二区三区久久精品茉莉花| 欧美在线观看你懂的| 免费试看一区| 在线亚洲欧美视频| 久久精品成人欧美大片古装| 另类av一区二区| 欧美三级网页| 亚洲国产成人不卡| 国产日韩精品视频一区| 亚洲欧美成人| 久久99伊人| 欧美成人久久| 99国产精品视频免费观看一公开| 中文在线一区| 久久久www成人免费无遮挡大片| 理论片一区二区在线| 欧美午夜a级限制福利片| 国内精品久久久久影院色| 亚洲精品一区二区三区不| 久久国产婷婷国产香蕉| 亚洲精品一区在线观看| 久久都是精品| 国产精品男女猛烈高潮激情| 亚洲另类黄色| 乱码第一页成人| 亚洲欧美变态国产另类| 欧美乱妇高清无乱码| 在线观看福利一区| 欧美在线视频一区| 艳女tv在线观看国产一区| 美女视频黄免费的久久| 韩国三级在线一区| 欧美一级欧美一级在线播放| 亚洲日本va午夜在线影院| 久久亚洲精品欧美| 国内精品久久久久久久果冻传媒| 亚洲婷婷综合久久一本伊一区| 欧美成人午夜激情| 久久久精品国产一区二区三区| 国产精品九九| 亚洲一区二区三区四区在线观看| 亚洲国产99| 欧美 亚欧 日韩视频在线| 黄色av成人| 久久中文字幕导航| 久久丁香综合五月国产三级网站| 国产欧美精品在线观看| 欧美一区二区在线播放| 亚洲欧美日韩国产中文| 国产精品一区在线播放| 欧美一级专区免费大片| 午夜精品久久久久久久99热浪潮| 国产精品永久在线| 久久激情一区| 久久久不卡网国产精品一区| 伊人成年综合电影网| 欧美国产1区2区| 欧美精品久久久久a| 日韩视频在线免费观看| 亚洲精品你懂的| 欧美不卡一卡二卡免费版| 最新中文字幕亚洲| 亚洲人成网站精品片在线观看| 欧美激情一区二区三区蜜桃视频| 亚洲乱码精品一二三四区日韩在线| 91久久精品国产91性色tv| 欧美精品少妇一区二区三区| 欧美一区二区三区日韩| 99在线|亚洲一区二区| 欧美天天视频| 午夜精品久久久久影视| 亚洲欧美视频一区二区三区| 国产亚洲一区二区在线观看 | 久久国产加勒比精品无码| 久久精品视频99| 亚洲精品一区二区三区av| 亚洲丝袜av一区| 狠狠色噜噜狠狠色综合久| 亚洲国产精品悠悠久久琪琪| 国产精品福利在线观看网址| 久久精品国产亚洲5555| 欧美aaa级| 欧美中文在线观看| 欧美va亚洲va日韩∨a综合色| 亚洲男女自偷自拍图片另类| 久久久久久9999| 亚洲小视频在线观看| 久久久久久综合| 中文亚洲欧美| 久久中文在线| 欧美一级一区| 欧美精品九九| 免费成人小视频| 国产精品伦一区| 最新亚洲一区| 精品不卡一区| 亚洲欧美日韩人成在线播放| 亚洲免费成人av| 久久色在线播放| 久久国产福利| 国产精品免费一区二区三区观看| 亚洲第一精品电影| 国模 一区 二区 三区| 一区二区日韩欧美| 99国产精品国产精品毛片| 久久久久久网站| 欧美伊人久久| 国产精品久久久久高潮| 亚洲精品社区| 亚洲精品午夜精品| 久久综合精品国产一区二区三区| 香蕉精品999视频一区二区| 欧美日本乱大交xxxxx| 欧美大片一区| 亚洲国产欧洲综合997久久| 久久狠狠婷婷| 久久尤物视频| 国模一区二区三区| 性高湖久久久久久久久| 欧美在线免费视屏| 国产精品一区二区三区观看 | 亚洲免费影视第一页| 亚洲一区二区免费看| 欧美日韩另类一区| 一本不卡影院| 亚洲欧美激情视频| 国产精品中文字幕在线观看| 亚洲香蕉成视频在线观看| 亚洲欧美日韩一区二区三区在线观看 | 国产欧美精品日韩精品| 亚洲私拍自拍| 午夜欧美精品| 国产日韩一区在线| 久久狠狠亚洲综合| 欧美激情成人在线视频| 亚洲欧洲另类| 欧美日韩国产在线一区| 亚洲免费成人av电影| 亚洲在线一区| 国产在线乱码一区二区三区| 久久久噜噜噜久久人人看| 欧美大片免费久久精品三p | 日韩视频在线观看| 欧美视频在线不卡| 亚洲一区二区三区久久| 久久精品一区二区| 亚洲动漫精品| 欧美日韩综合不卡| 欧美一区二区三区在线免费观看| 开心色5月久久精品| 亚洲精品一区久久久久久| 欧美天堂亚洲电影院在线播放| 亚洲欧美久久久久一区二区三区| 久久久精品动漫| 亚洲精品一区二区三区不| 国产精品手机在线| 久久综合伊人| 中文av字幕一区| 欧美成人免费一级人片100| 亚洲一区高清| 亚洲国产精品综合| 国产精品久久久久久一区二区三区| 亚洲欧美一区二区原创| 欧美激情视频一区二区三区在线播放 | 午夜影视日本亚洲欧洲精品| 尤物yw午夜国产精品视频| 欧美片网站免费| 欧美一区二区私人影院日本| 亚洲日本成人在线观看| 久久精品免费| 亚洲无线视频| 亚洲精品一区二区三区樱花| 国产欧美一区二区精品婷婷| 欧美成熟视频| 久久蜜桃精品| 翔田千里一区二区| 一本久道综合久久精品| 欧美二区在线观看| 久久久国产一区二区三区| 亚洲综合欧美日韩| 日韩手机在线导航| 亚洲成色精品| 国产亚洲精品自拍| 国产精品激情电影| 欧美色图首页| 欧美日韩亚洲一区二区三区在线观看| 久久国产毛片| 久久精品国产久精国产爱| 亚洲一区二区三区在线视频|