Total Pageviews

2021/06/05

[閱讀筆記] Algorithms to Live By - 快取 (Caching)

 快取 (Caching) - 忘掉就算啦!

  1. 書桌的空間有限,cache 也是如此。當 cache 裝滿時,就需騰出空間後,才能放新的資料。騰出空間的程序稱為快取替換 (cache replacement) 或快取剃除 (cache eviction)。cache 的容量比主記憶體的容量小很多,資料不可能永遠放在 cache 裡,故系統會使用演算法逐步覆蓋 cache 內容,此演算法稱為替換策略 (replacement strategy) 或剃除策略 (eviction strategy)。

  2. Bélády 於 1965 年發表的快取演算法論文,成為被引用次數最多的電腦科學研究長達 15 年。論文提到,cache 的目標,是盡量減少在 cache 中找不到所需的資料,以致於必須轉至速度較慢的記憶體尋找的狀況,這類狀況稱為巡頁丟失 (page fault) 或快取未中 (cache miss)。cache 的最佳策略是,在 cache 快滿時,剃除最久之後才會再次需要用到的資料

演算法

說明

隨機剔除 

(Random Eviction)

把新資料放進 cache,隨機複寫舊資料

先進先出 

(FIFO,First In, First Out)

剔除或複寫 cache 內存放最久的資料

🏆 最近最少使用法

(LRU, Least Recently Used)

剔除未使用時間最長的資料。

我們下次可能需要的資料就是上次用過的那些,再接下來需要的可能就是前面倒數第二次使用的資料;此外,我們最不需要的資料,就是未使用時間最長的那個

  • 不管使用哪種演算法,就算是「隨機剃除演算法」也能提升效率。

  • 這三種演算法以「 LRU」 表現最好。想像你在電腦前工作,在 Outlook、Chrome、Word 間不斷用 TAB 切換,如果你剛剛使用其中之一,代表可能會再用到它;如果沒有意外,上次使用時間離現在最久的程式,通常也會隔好一段時間才會使用到它。


  1. 在電腦科學家進行的大多數測試中,LRU 演算法表現得非常優異。這帶出一個應用至圖書館:把圖書館內外翻轉,把新進書籍放後面,讓想看的讀者自己去找;最近剛歸還的則放在大廳書櫃,讓學生跳過上架程序先看到這些剛歸還的書,圖書館員不必進入書庫放置圖書,學生也不用進入書庫再拿出來,這就是 cache 的原始用意。

  1. CDN (Content Delivery Network,內容傳遞網路) 就是一種 cache 技術。 CDN 會將快取的內容儲存在使用者附近的邊緣伺服器上的存在點 (POP) 位置中,以將延遲降至最低。

CDN 優點

說明

① 網站穩定度增加

即使某一台CDN伺服器故障或被Dos攻擊癱瘓了,CDN會自動切換到較近且較順暢的主機資源給使用者。

② 有效節省頻寬

所有用戶都不再向同一個伺服器讀取資料,大量降低了原本主機的頻寬及負載。

分散使用者要求,並從邊緣伺服器直接提供內容,以減少傳送至原始伺服器的流量。

③ 改善網站體驗

大多數網站的頻寬消耗,都是圖檔、影片等大型檔案的傳輸,透過 CDN 服務的分散式儲存,將這些檔案緩存起來、可以有效提升網頁的速度。

Ref. 1: https://reurl.cc/mq38V1 

Ref. 2: https://reurl.cc/raRyMx 

Ref. 3: https://reurl.cc/Dv3zGj 


  1. Amazon 也將 LRU cache 概念應用在物流管理,並取得專利。此專利名稱為「預測包裹寄送」,讓 Amazon 在消費者下單前,將商品先寄送到消費者該區的臨時倉庫,此概念與 CDN 相仿。當消費者真的下單時,商品距離消費者已經很近,將交貨時間最小化。

  1. LRU 應用於生活

LRU 應用於生活

說明

① 保留或捨棄衣服

若你有件大學時期買的 T-shirt 還有在穿,就不一定要丟;但有件好久沒穿的毛衣,送去二手商店說不定比較能遇到有緣人。

② 充分利用地理環境

跑步與運動用品放置地點應盡量接近大門。

衣帽架是你的 cache,冬天的大衣、外套、領帶等,應掛在衣帽架上以利穿脫,且衣帽架應接近大門。


  1. 在文件收納,若我們遵照 LRU 原理,每次都把抽出來的文件放回檔案列表最前面 (move-to-front),那麼搜尋所花的時間,絕對不會超過我們所預知的兩倍,其他演算法都無法保證這點。LRU 不僅是最有效率,而且是最佳方法。

  2. LRU 雖然是最有效率而且最佳方法,這不代表我們必須放棄分類。如果想把物品弄得華麗一些,同時加快搜尋速度,你可在不同的檔案類別貼色彩色標籤。如此一來,若你要找的是帳戶類的資料,就可以把線性搜尋限制在這類的檔案,這個類別的檔案可依據「移至前端」(move-to-front) 法則排序。

  1. 當我們面對一箱文件時,可以將其旋轉 90 度,從一箱檔案變成一疊檔案,如此一來搜尋檔案時自然會從上至下,每次抽出文件後要放回去,自然就會放最上面。我們也可強制電腦將電腦文件顯示為一疊,電腦預設以名稱 A 到 Z 排序,但從 LRU 強大的功效看來,我們應更改原始設定,修改為「最近開啟」,這樣我們要修改的檔案大多會集中在最上方

  2. 在書桌上一大疊文件不但不是雜亂象徵,還是目前已知最精良、效率最佳的資料結構,沒必要因此感到罪惡感。在別人眼裡看來或許凌亂、欠缺條理,其實它自有一套條理。由於我們無法預知未來,所以把用過的東西放在最上面是最好的方法,刻意不排序往往比花時間排序更有效率,我們不需整理的理由不是懶,而是已經整理好了

  3. Cache 特別強調時間,人腦的記憶無可避免必須進行取捨,而且結果一定是零和。我們無法把所有圖書館的書都放到書架上、把所有商品都放上商店的商品陳列架上、把所有論文都放在整疊文件的最上方、把所有的事實/臉孔/姓名都放在頭腦的最前端。我們常認為人隨著年紀人隨著年紀增長而變得健忘是「認知功能衰退」,然而如果記憶非得進行取捨,而且大腦已經非常適應周遭世界,那麼或許就不是認知功能衰退。

  4. 當電腦記憶體容量越大,搜尋與取出所需資料的時間就越長。人腦也是如此,當年紀越大,需要處理的記憶容量就越大,每天要解決的運算問題就越艱辛。經研究,單單只是懂更多,就會影響辨識單字、人名甚至字母的能力,無論採用的整理方法多優異,只要必須搜尋的資料量增加,花費的時間就會拉長。

  5. Cache 讓我們理解大腦的運作,我們常說到的「恍神」其實是快取未中 (cache miss)。檢索資料時的延遲機率變高,代表我們應把最需要的資料放在最前端,藉此提高檢索效率。當我們漸漸老化,就會開始出現延遲現象,也不用過度擔心,這也代表我們經驗豐富程度。檢索時花費的力氣代表我們知道多少東西,很少出現檢索延遲代表我們整理得很好,經常把最重要的東西放手邊,隨時取用

2021/06/04

[閱讀筆記] Algorithms to Live By - 排序 (Sorting)

 排序 (Sorting) - 依照順序排列

  1. 在 1960 年代,有一項研究估計,全世界的電腦運算資源有 ¼ 以上用於排序。這點其實可以想見,因為排序對於處理各種資訊都非常重要。無論是找出最大或最小、最常見或最罕見、紀錄、製作索引、挑出重複物件,或者單純只要找出需要的資料,各種工作一開始通常都得先排序。

  2. 追根究柢,排序的主要理由就是以好用的方式呈現物件,因此排序也對人類的資訊經驗極為重要:

排序例子

說明

E-mail 收件夾

依據寄信時間做排序

Yelp 餐廳搜尋結果

依據距離或評價最高做排序

Google

依據搜尋關聯性做排序,呈現最具關連的前十個網站,成為搜尋引擎霸主

Facebook / Twitter

依據文章張貼日期做排序


  1. 1955 年 J.C. Hosken 在史上第一篇發表的排序論文中寫到:「為了降低每單位的成本,人類通常會加大運作規模。」這就是所謂的規模經濟,但是規模卻造成排序災難。排序規模加大時,排序的單位成本不減反增,導致嚴重的負規模經濟。例如,假設書架上有 100 本書,另外有兩個書架各 50 本,排好前者的時間一定大於後者,因此需要整理的書以及每本書可以放的空格,都多了一倍。需要處理的東西越多,狀況就越糟。

  2. 要減少排序的辛苦和麻煩,重點是減少排序對象的數量

🧦 以抽襪子為例

以湊成對的襪子為例,假設有 10 雙不同顏色與花紋的襪子,我要從洗乾淨的置衣籃湊成雙收好,我會先隨機抽 1 雙襪子,再平均抽 19 次,就能湊到第 1 雙;再隨機抽取 1 雙襪子,再平均抽 17 次,就能湊到第 2 雙,以此類推,最後要再置衣籃裡抽 110 次,就能把 20 支襪子湊成對。

要避免太多襪子造成排序困難的話,最佳方法就是經常洗襪子。以上述為例,10 天洗一次,需要排 110 次;3 天洗一次只需排 12 次、4 天洗一次需排 16 次 (+4)、5 天洗一次需排 30 次 (+18)。


  1. 大O符號 (Big-O Notation),又稱為漸進符號,是用於描述函式漸近行為的數學符號。更確切地說,它是用另一個(通常更簡單的)函式來描述一個函式數量級的漸近上界。在數學中,它一般用來刻畫被截斷的無窮級數尤其是漸近級數的剩餘項;在電腦科學中,它在分析演算法複雜性的方面非常有用。假設你要辦個晚宴,邀請 n 名賓客:

打掃房子的時間 O(1)

為接待賓客而打掃房間所需的時間,與賓客人數無關,稱為「1的大 O】。寫成 O(1), 又稱為常數時間 (constant time),不理會打掃需要多久時間,只說明打掃時間與賓客人數無關


烤肉在桌上傳遞一圈的時間 O(n)

傳遞一圈的時間是 n 個大 O,寫成 O(n),又稱為線性時間 (linear time),也就是說,賓客人數加倍,盤子傳到你面前的時間也加倍。

賓客互相擁抱的時間 O(n2)

如果賓客抵達時,會互相擁抱。第一位賓客只要跟你擁抱就好,第二位要擁抱兩次,第三位要擁抱三次。這時候稱為 n 平方的大 O,寫成 O(n2),又稱為平方時間 (quadratic time)。


更糟糕的狀況

  • 指數時間 (exponential time):寫成 O(2n),也就是每增加一位賓客,你的工作就會加倍。

  • 階層時間 (factorial time):寫成 O(n!),通常是用暴力方法解決複雜問題。

(Ref.: https://reurl.cc/pmMnxa)


  1. 氣泡排序法 (Bubble Sort) 與插入排序法 (Insertion Sort)

氣泡排序法 (Bubble Sort)

是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

是最簡單瞭解和實作的排序算法之一,但它對於包含大量的元素的數列排序是很沒有效率的

  • 平均時間複雜度O(n2)

  • 最壞時間複雜度O(n2)

  • 最佳時間複雜度O(n)

(Ref.: https://reurl.cc/Dv3nRE)

插入排序法 (Insertion Sort)

此排序法優點是比氣泡排序法更直覺,評價較好,缺點是其實沒有快多少。採取此方式時,每個位置還是都要插一次,每次插入平均時間需經過一半的位置,才能找到正確的位置。儘管插入排序法速度快了一點,花費時間仍是平方時間,沒有比氣泡排序快多少

  • 平均時間複雜度O(n2)

  • 最壞時間複雜度O(n2)

  • 最佳時間複雜度O(n)

(Ref.: https://reurl.cc/qmNdzy)


  1. 上述兩個看似合理且直覺的排序方法,搜尋時間都是平方時間 (quadratic time, O(n2)),排序對象一多就難以負荷。合併排序 (merge sort) 就是用來解決上述難題,它的複雜性介於線性時間和平方時間之間,更精確地說是線性對數時間 (linearithmic time, O(n log n))。屬於 Divide and Conquer 演算法,把問題先拆解 (divide) 成子問題,並在逐一處理子問題後,將子問題的結果合併(conquer),如此便解決了原先的問題

(Ref.: https://reurl.cc/bzEEnl)

  1. 排序與運動賽事的類比

排序方法

運動賽事

Bubble sort

羽球、壁球等常用的排位賽 (ladder),是依照排名順序列出的選手名單,每名選手可以挑戰前一名選手,如果獲勝,排名就對調。這就是運動界的 bubble sort,執行時間是平方時間。

Merge sort

NCAA 的單淘汰制 (tournament bracket),每一輪比賽都淘汰一半隊伍,從 64 強、32 強、16 強、8 強、4 強以及決賽。這就是運動界的 merge sort,一開始為排序的隊伍兩兩比賽,接著不斷對併再對併。


  1. 排序與搜尋的權衡:拿你絕對不會搜尋的資料來排序是浪費時間,搜尋沒排序過的資料則效率極差。排序資料所花的心力是先制行動,目的是讓我們日後不用花費心力搜尋資料。真正的平衡點應取決於狀況的確實參數,但如果說排序唯一價值是輔助日後查詢,就可以看出一個驚人事實:寧亂勿整。例如,現在電子郵件軟體的搜尋功能已經相當完善,當搜尋成本降低時,排序的價值就會跟著降低

  2. 不排序資料或許可以想成一種延遲行為,把責任推給未來的自己,讓他連本帶利地付出逃避的代價。不過整個狀況其實更加微妙,有時候混亂不只出於偷懶,而是最佳選擇。

  3. 在奧運場上,拳擊選手必須冒著腦震盪的風險,比 O(log n) 次才能舉起金盃 (通常四到六次);馬拉松選手則只需比一次。如果能以一個簡單數值來評量表現,就能以常數時間演算法來決定名次。從只能呈現排名的序數改成基數 (直接指定評定水準的方式),就能自然地依序排列,例如 Fortune 500 的排名,不需公司間兩兩比較,只要有基準就能解決排序規模擴大產生的運算問題。

共通基準的例子

說明

⛵ 航海通行公約 - 

依總噸位法則 (Law of Gross Tonnage) 決定

船的總噸位決定一切,小船要禮讓大船

🐟 魚類的默契 - 

依 size 決定

越大的魚越有優勢,小魚要禮讓大魚;size 差不多則會互相逞兇鬥狠

🌏 G20 參與的成員國 - 

依 GDP 決定

或許有人認為 GDP 太粗糙,但只要有一個單一參考點,就能很快解決國家地位問題,省去線性對數次數的鬥爭與決議

💰 Fortune 500 - 

依公司營業額決定

以公司的營業額為排名,評選全美最大的 500 家公司的排行榜。


  1. 在小規模族群中,線性對數次數的打鬥或許行得通,自然界的族群也經然如此。但再藉由兩兩比較決定地位的領域中,衝突次數將隨群體數目成長而快速增加。要讓成千上萬、甚至數百萬個群體生活在同一空間中,就必須跳脫出來,從序數變成基數 (或稱為基準)。人類和猿猴、雞等動物的差別是,以競賽取代打鬥

  2. 假設你是位正在撰寫論文的研究生,已知圖書館有數本需要隨時可參考的書籍,你會希望借閱這幾本書,放在宿舍的書桌上,而非需要參考時還要特地去圖書館一趟。此時,你的書桌就是電腦領域提到的 cache (快取),當書桌上有可重複利用的書籍,你書桌的價值就越高;當你越常回圖書館找資料,工作進度越慢,書桌利用率越低,書桌價值就越低。