雜湊技術
直接定址表是對陣列的一種簡單擴充套件,適用於元素的關鍵字全域[0,1...m-1]範圍較小的情況,每個槽對應乙個關鍵字,如果槽k為nil,說明沒有關鍵字為k的元素。
如果元素存在某種一致性而可以直接放在乙個序列裡,可以考慮直接在陣列中存放元素,使用下標作為索引,這樣直接定址表就退化為陣列。
如果只需要資料結構支援insert、delete和search三種操作,那麼雜湊技術是最好的存放海量資料的方法,這種技術在資料庫中被大量使用。簡單來說就是使用雜湊函式將關鍵字對映到槽中,當需要搜尋關鍵字時,直接如果有兩個不同的關鍵字卻雜湊到同乙個槽中,這種情況被稱為碰撞。
為了避免碰撞,雜湊函式要盡可能隨機,使得碰撞即使發生,也不能太過集中。這樣可以保持操作的期望速度為o(1)。
但是碰撞是不可避免的,尤其是資料量很大的情況下。書中介紹了鏈結法和開放定址法來解決碰撞問題。
鏈結法(chaining)是將所有碰撞的元素放在乙個鍊錶中,然後對雜湊表的操作也就對映到鍊錶中。如果元素不存在,那麼陣列(雜湊表)中的元素為nil。
利用概率分析,我們可以證明使用鏈結法可以使三種操作的期望操作時間保持在o(1)。
雜湊函式:乙個好的雜湊函式可以使雜湊值趨於簡單一致,不過這一般很難實現。通過對關鍵字的分析而得到效能盡可能好的雜湊函式的方法稱為「啟發式」的方法。
一般將key解釋為自然數,如果key不是自然數,可以使用某種演算法將之轉換為自然數。
除數雜湊法:h(k)=k mod m,難點在m的選擇(即雜湊表的大小),一般取為與2的整數冪不太接近的質數。
乘法雜湊法:h(k)=$\lfloor m(ka \mod 1) \rfloor$,0w的乙個整數,w是計算機的字長,一般取a=$(\sqrt-1)/2$,或與之接近的數。
全域雜湊:準備一組有限的雜湊函式$\mathcal$,這些函式都將關鍵字u對映到[0,m-1]中,在雜湊的時候隨機選擇乙個函式作為雜湊函式。設計乙個全域雜湊需要一定的數論知識(好吧我看不懂…)
開放定址法:開放定址法不使用衛星資料,所以n≤m必須成立。我們將雜湊函式h(k)進行擴充,增加乙個因子稱之為探查號。h(k,i),對於每乙個key,需要i次不同的查詢。有多種方法來計算探查序列,線性查詢,二次探查和雙重雜湊等等,其中雙重雜湊的效能較好。
完全雜湊:使用兩重雜湊技術,第一重確定下標,第二重確定碰撞後同乙個槽的雜湊表中的下標。為了徹底解決碰撞問題,必須讓第二級雜湊表的大小是其中存放元素數的平方。適用於靜態關鍵字的情況。
本章基本上都是數學…如果不能好好理解的話,寫出效能很好的**是很困難的。除法雜湊和乘法的雜湊都很簡單,而且效能也不好。一般實際使用中,鏈結法和開放定址法使用的較多。**…還是不獻醜了,試著寫了開放定址,一時半會搞不定,先放這吧,時間無多,還是先備戰面試要緊的課題【讓你平時盡學一些沒用的!】
作業全是數學,俺放棄了…回頭閒下來再做吧。總之,這一章先到這裡。
csapp2e 讀書筆記
1.2 c語言中的移位運算 1.3 整數表示 1.1.1 交換兩個值 void inplace swap int x,int y 這種交換方式並沒有效能上的優勢,僅僅是個智力遊戲 步驟 x y初始ab 第一步a a b第二步 ba b 第三步ba 網路資料 異或運算的作用 0異或任何數 任何數 1異...
讀書筆記2
關於this指標 雖然this指標大家已經很熟悉了,但是我這裡討論的關於this指標的問題可能大家還沒注意過 為了說明這個關於this的歸屬問題,我自寫了一段再簡單不過的程式,雖簡單但具體 include class a void aa 我的問題是指標p1是指向b自身嗎?一看程式,大家就知道 不是,...
讀書筆記(2)
沉默的藝術 意識科學基礎理論 量子效應只是用於穩定某種內在自由度極大的基本粒子,然後再用基本粒子的內在屬性產生意識體驗。只能通過呈現乙個系統的 物理 屬性來描述乙個系統。只能通過變成內在屬性配對的其中乙個系統,以直接體驗的方式來獲得這些內在屬性的資訊。定義乙個包含所有系統的系統d,除該系統外無任何系...