LRU 居然翻譯成最近最少使用?真相原來是這樣!(附力扣題解)

2023-02-28 06:01:59

前言

相信有很多同學和我一樣,第一次碰到 LRU(Least Recently Used) 的這個解釋「最近最少使用」都不知道是什麼意思,用湯家鳳老師的話來說:

我真的感到匪夷所思啊!

最近是表示時間,最少是表示頻度,拆開來都知道,但是合在一起就不知道是什麼意思了。經過一番搜尋後,我發現這可能是國內一些專業名詞的通病:翻譯問題。甚至百度百科對 LRU 的解釋也是這樣:

LRU 是 Least Recently Used 的縮寫,即最近最少使用,是一種常用的頁面置換演演算法,選擇最近最久未使用的頁面予以淘汰。該演演算法賦予每個頁面一個存取欄位,用來記錄一個頁面自上次被存取以來所經歷的時間 t,當須淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。

什麼叫「選擇最近最久未使用的頁面予以淘汰」?今天我們就來摸一摸它的底!

LRU 演演算法過程

LRU 常見的實現是使用一個雙向連結串列儲存快取資料,演演算法步驟如下:

  1. 插入新資料時會插入到連結串列頭部;
  2. 當快取資料被存取時,將該資料移到連結串列尾部;
  3. 當連結串列滿的時候,將連結串列頭部的資料丟棄。

看完演演算法過程,內心驚呼:這不就是當容量不夠用的時候淘汰最久沒存取的資料麼,和最少有個毛關係啊!按我的理解,Least Recently 其實應該翻譯成 「最不是最近的」也就是最遠的,Least 其實是修飾 Recently,而不應該和它並列翻譯成「最近最少」,LRU 說到底就是一個時間維度上的快取優化演演算法。

LRU 的兄弟 LFU

LFU(Least Frequently Used)和 LRU 比較相似,也是快取優化演演算法,但是他和 LRU 唯一的區別就是,LRU 是時間維度上的,當快取滿的時候,將最久沒使用的資料丟棄,而 LFU 是頻率維度上的,會將最少使用(使用頻次最低)的資料丟棄。

百度百科上對 LFU 的解釋如下:

LFU(least frequently used (LFU) page-replacement algorithm)。即最不經常使用頁置換演演算法,要求在頁置換時置換參照計數最小的頁,因為經常使用的頁應該有一個較大的參照次數。但是有些頁在開始時使用次數很多,但以後就不再使用,這類頁將會長時間留在記憶體中,因此可以將參照計數暫存器定時右移一位,形成指數衰減的平均使用次數。

這就有點搞笑了, LFU 的翻譯是「最不經常使用」,既然作為 LRU 的兄弟,難道你不應該翻譯成「最經常最少使用」演演算法嗎?