進階電腦系統理論與實作 (Fall 2017)
contributed by < jcyztw
, davidshih0908
>
參考 ierosodin 實作 memory pool 的程式碼,依樣畫葫蘆實作,測試看看使用 memory pool 可以將 miss rate 降到多低。
我在實作 memory pool 時,是基於 hash table 方案來加以改善,兩者差別只是在建立電話簿中的資料時 ( append()
),每筆 entry 配置記憶體的方式不同。hash table 的作法是使用 malloc()
配置記憶體,而 memory pool 是用一開始配置好的 pool 直接指定可使用的記憶體位址。
上面的程式碼為 memory pool 優化方案透過 pool_alloc()
直接指定可使用的記憶體位址。
以下是 memory pool 相關操作 (create, allocate, free) 的程式碼片段:
利用 perf stat -e
指令來紀錄 cache miss,cache reference 次數,總指令數以及總 cycle 數,下方表格用來比較 miss rate:
original | resized structure | hash table | memory pool |
---|---|---|---|
87.693% | 51.938% | 43.080% | 37.338% |
由下圖可看出 memory pool 方案是所有情況中 append()
以及 findName()
中執行時間花費最短的。
我們實作了兩種搜尋相似字串的演算法:
透過這兩種演算法可以算出 edit distance (意即將一字串轉換成另一個字串所需之編輯次數,編輯可分為插入、刪除以及取代三種操作)。
以下是實作 Wagner-Fischer algorithm,搜尋 words.txt
中,與 kaneshiro
的相似字串:
similarity 表示設定的 edit distance,此處是設為 3。以上搜尋到的 last name,都是與 kaneshiro
的 similarity 小於或等於 3 的字串。
參考維基百科,Wagner-Fischer algorithm 的程式碼如下:
模糊搜尋(fuzzy search),找出與你給定字串相似的字串,一般來說可以透過查字典的方法找出與你相近的字串。常用於 search engine
,e.g. google search 中,當你輸入 mississipp
, google search 會建議你要不要搜尋 mississippi
。
找出相似字串的演算法有很多種,依據 Fuzzy search strings ,以下針對下列兩種作說明:
Levenshtein distance 是將一字串轉換成另一個字串所需之編輯次數,能使用的編輯方式有插入,刪除或是取代三種。若將這 3 個操作方式的 cost 視為相同,則「總 cost = 總編輯次數 每編輯一次的 cost 」。
其數學式為:
以字串 kitten
與 sitting
做示範,若想將 kitten
轉換成 sitting
:
得到總編輯次數等於 3。
在實作上可以採用 recursive
或者 iterative
:
recursive
不是很有效率的做法,會有大量的重複計算,因此不作介紹iterative
的話可以採用 Wagner–Fischer algorithm 來實作 (利用 dynamic programming 的方式算兩字串的編輯距離),其演算法如下:很直接的就是設初值,然後開始建表。以 GARVEY
和 AVERY
為例,算出 edit distance 為 3。
BK-trees 是建立在 Levenshtein distance 的基礎上的樹狀資料結構。
若有一棵叫作 T 的 BK-tree,由於 BOOK
與 BOOKS
的 Levenshtein distance 為 1,所以在 BOOK
與 BOOKS
相連的邊上標上 1 (T 見下圖)。
以下介紹如何插入節點至 BK-tree 以及如何在 BK-tree 中尋找相似的字串。
舉例來說 (使用上圖作例子),假如若想插入一字串 BOO
,首先算出與 root (BOOK
) 的 Levenshtein distance (得到 distance = 1),找到子節點 BOOKS
作為新的 root (distance = 1);接著計算 BOO
跟 BOOKS
的 Levenshtein distance,得到 distance = 2。因為找不到邊值相符的子節點,便將 BOO
插在 BOOKS
之下 (如下圖)。
以上圖的 BK-tree 來搜尋字串 CAQE
為例,令 distance tolerance N = 1:
BOOK
與 CAQE
的 Levenshtein distance (distance = 4),而 distance 並沒有小於或等於 N ( 不成立),因此 BOOK
不列入匹配的字串選擇中。再接著搜尋邊值落在 範圍內的 BOOK
子節點。CAKE
,重複 1 的作法,得到 distance = 1,distance 等於 N,故將 CAKE
列入匹配的字串中。接下來搜尋邊值落在 範圍內的 CAKE
子節點。CAPE
和 CART
,重複 1 的作法:CAQE
與 CAPE
的 distance = 1,因此將 CAPE
列入匹配的字串選擇中;CAQE
與 CART
的 distance = 2,因 distance 大於 N,故不將 CART
列入匹配字串。在 distance tolerance 為 1 的情況下,最終得到的相似字串有:CAKE
以及 CAPE
。
名詞解釋:
信賴區間 (Confidence Interval) 是對機率樣本的某個總體參數的區間估計;而信賴區間展現這個總體參數的真實值有一定機率落在與該測量結果有關的某對應區間,這個「一定機率」稱為信心水準。
舉例來說,某選舉的民意調查中,「在 95% 信心水準下,抽樣誤差在正負 3.1% 以內,甲候選人獲得 37% 的選民支持,乙候選人則有 23% 的支持率。」意即我們有 95% 的信心,支持甲的選民比例,在 (0.339, 0.401) 範圍內,而支持乙的選民比例,在 (0.199, 0.261) 的範圍內。這兩個範圍即信賴區間。
一個描述這個連續隨機變量 (continuous random variable) 的輸出值,在某個確定的取值點附近的可能性的函數。而隨機變量的取值落在某個區域之內的機率,則為機率密度函數在這個區域上的積分。
以下使用 ASPE4e 課本 (見參考資料) P.112 範例 4-1 輔助說明。
表示在一細薄銅線 (thin copper wire) 中測量到的電流 (單位為 mA,毫安培),假設 的範圍為 [0, 20 mA],且 的機率密度函數 ,此時銅線中電流小於 10 毫安培的機率為何?
不在 的範圍內的 ,範例所求機率等於下圖中的陰影範圍。
是機率密度函數的積分,能完整描述一個實隨機變量 的機率分布。
舉例說明前,首先看看 ASPE4e 課本給的累積分佈函數的數學定義:
一個連續隨機變數 (continuous random variable) 的累積分佈函數為
舉例:延續在機率密度函數部份的例子,找出 的累積分佈函數。
的 CDF 由三個部份組成:
If , , therefore , for
And , for
Finally, , for
整理之後得到以下結果:
上述式子作圖後如下: