<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 100  文章 - 50  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    我收藏的一些文章!

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    雖然我們不希望發生沖突,但實際上發生沖突的可能性仍是存在的。當關鍵字值域遠大于哈希表的長度,而且事先并不知道關鍵字的具體取值時。沖突就難免會發 生。另外,當關鍵字的實際取值大于哈希表的長度時,而且表中已裝滿了記錄,如果插入一個新記錄,不僅發生沖突,而且還會發生溢出。因此,處理沖突和溢出是 哈希技術中的兩個重要問題。
    1、開放定址法
         用開放定址法解決沖突的做法是:當沖突發生時,使用某種探查(亦稱探測)技術在散列表中形成一個探查(測)序列。沿此序列逐個單元地查找,直到找到給定 的關鍵字,或者碰到一個開放的地址(即該地址單元為空)為止(若要插入,在探查到開放的地址,則可將待插入的新結點存人該地址單元)。查找時探查到開放的 地址則表明表中無待查的關鍵字,即查找失敗。
    注意:
    ①用開放定址法建立散列表時,建表前須將表中所有單元(更嚴格地說,是指單元中存儲的關鍵字)置空。
    ②空單元的表示與具體的應用相關。
         按照形成探查序列的方法不同,可將開放定址法區分為線性探查法、線性補償探測法、隨機探測等。
    (1)線性探查法(Linear Probing)
    該方法的基本思想是:
        將散列表T[0..m-1]看成是一個循環向量,若初始探查的地址為d(即h(key)=d),則最長的探查序列為:
            d,d+l,d+2,…,m-1,0,1,…,d-1
         即:探查時從地址d開始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循環到T[0],T[1],…,直到探查到T[d-1]為止。
    探查過程終止于三種情況:
         (1)若當前探查的單元為空,則表示查找失敗(若是插入則將key寫入其中);
        (2)若當前探查的單元中含有key,則查找成功,但對于插入意味著失敗;
         (3)若探查到T[d-1]時仍未發現空單元也未找到key,則無論是查找還是插入均意味著失敗(此時表滿)。
    利用開放地址法的一般形式,線性探查法的探查序列為:
            hi=(h(key)+i)%m 0≤i≤m-1 //即di=i
    用線性探測法處理沖突,思路清晰,算法簡單,但存在下列缺點:
    ① 處理溢出需另編程序。一般可另外設立一個溢出表,專門用來存放上述哈希表中放不下的記錄。此溢出表最簡單的結構是順序表,查找方法可用順序查找。
    ② 按上述算法建立起來的哈希表,刪除工作非常困難。假如要從哈希表 HT 中刪除一個記錄,按理應將這個記錄所在位置置為空,但我們不能這樣做,而只能標上已被刪除的標記,否則,將會影響以后的查找。
    ③ 線性探測法很容易產生堆聚現象。所謂堆聚現象,就是存入哈希表的記錄在表中連成一片。按照線性探測法處理沖突,如果生成哈希地址的連續序列愈長 ( 即不同關鍵字值的哈希地址相鄰在一起愈長 ) ,則當新的記錄加入該表時,與這個序列發生沖突的可能性愈大。因此,哈希地址的較長連續序列比較短連續序列生長得快,這就意味著,一旦出現堆聚 ( 伴隨著沖突 ) ,就將引起進一步的堆聚。
    (2)線性補償探測法
    線性補償探測法的基本思想是:
    將線性探測的步長從 1 改為 Q ,即將上述算法中的 j = (j + 1) % m 改為: j = (j + Q) % m ,而且要求 Q 與 m 是互質的,以便能探測到哈希表中的所有單元。
    【例】 PDP-11 小型計算機中的匯編程序所用的符合表,就采用此方法來解決沖突,所用表長 m = 1321 ,選用 Q = 25 。

    (3)隨機探測
    隨機探測的基本思想是:
    將線性探測的步長從常數改為隨機數,即令: j = (j + RN) % m ,其中 RN 是一個隨機數。在實際程序中應預先用隨機數發生器產生一個隨機序列,將此序列作為依次探測的步長。這樣就能使不同的關鍵字具有不同的探測次序,從而可以避 免或減少堆聚。基于與線性探測法相同的理由,在線性補償探測法和隨機探測法中,刪除一個記錄后也要打上刪除標記。

    2、拉鏈法
    (1)拉鏈法解決沖突的方法
         拉鏈法解決沖突的做法是:將所有關鍵字為同義詞的結點鏈接在同一個單鏈表中。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指針組成的指針數 組T[0..m-1]。凡是散列地址為i的結點,均插入到以T[i]為頭指針的單鏈表中。T中各分量的初值均應為空指針。在拉鏈法中,裝填因子α可以大于 1,但一般均取α≤1。
    【例】設有 m = 5 , H(K) = K mod 5 ,關鍵字值序例 5 , 21 , 17 , 9 , 15 , 36 , 41 , 24 ,按外鏈地址法所建立的哈希表如下圖所示:
              
    (2)拉鏈法的優點
    與開放定址法相比,拉鏈法有如下幾個優點:
    ①拉鏈法處理沖突簡單,且無堆積現象,即非同義詞決不會發生沖突,因此平均查找長度較短;
    ②由于拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合于造表前無法確定表長的情況;
    ③開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;
    ④在用拉鏈法構造的散列表中,刪除結點的操作易于實現。只要簡單地刪去鏈表上相應的結點即可。而對開放地址法構造的散列表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之后填人散列表的同義詞結點的查找路徑。這是因為各種開放地址法中,空地址單元(即開放地址)都是查找失敗的條件。因此在 用開放地址法處理沖突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。

    (3)拉鏈法的缺點
         拉鏈法的缺點是:指針需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指針空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的沖突,從而提高平均查找速度。
    posted on 2013-04-12 00:14 fly 閱讀(832) 評論(0)  編輯  收藏 所屬分類: java學習
    主站蜘蛛池模板: 亚洲AV午夜成人片| 亚洲国产91精品无码专区| 国产亚洲综合久久系列| 成年大片免费高清在线看黄| 亚洲AV无码专区日韩| 色婷婷精品免费视频| 国产精品公开免费视频| 国产亚洲成在线播放va| 亚洲国产成人精品女人久久久 | 久久亚洲国产欧洲精品一| 十八禁的黄污污免费网站| 亚洲M码 欧洲S码SSS222| 国产高潮流白浆喷水免费A片 | 狠狠综合久久综合88亚洲| 99久久国产精品免费一区二区| 亚洲国产精品无码久久久蜜芽| 一级毛片免费观看| 亚洲人xxx日本人18| 国产亚洲精品免费| 美女被cao网站免费看在线看| 亚洲AV日韩AV高潮无码专区| 69av免费视频| 羞羞漫画登录页面免费| 亚洲日韩aⅴ在线视频| 16女性下面无遮挡免费| 亚洲人成网站色7799| 亚洲毛片网址在线观看中文字幕| 成全在线观看免费观看大全| 亚洲日韩国产精品无码av| 日本免费人成黄页在线观看视频| 久久精品成人免费国产片小草| 亚洲美女视频免费| 四虎永久在线精品免费观看地址| 巨胸喷奶水视频www免费视频| 亚洲国产韩国一区二区| 免费v片在线观看| 亚洲一区二区在线免费观看| 亚洲午夜理论片在线观看| 国产精品久久久亚洲| 噜噜嘿在线视频免费观看| 中文字幕免费在线看线人动作大片 |