天天看點

[網際網路面試筆試彙總C/C++-21] FIFO 、LRU、LFU的含義、原理和實作-完美世界

題目:請簡要介紹FIFO、LRU、LFU的含義和原理

含義:

FIFO:First In First Out,先進先出

LRU:Least Recently Used,最近最少使用

LFU:Least Frequently Used,最不經常使用

以上三者都是緩存過期政策。

原理和實作:

一、FIFO按照“先進先出(First In,First Out)”的原理淘汰資料,正好符合隊列的特性,資料結構上使用隊列Queue來實作。

如下圖:

[網際網路面試筆試彙總C/C++-21] FIFO 、LRU、LFU的含義、原理和實作-完美世界

1. 新通路的資料插入FIFO隊列尾部,資料在FIFO隊列中順序移動;

2. 淘汰FIFO隊列頭部的資料;

二、LRU(Least recently used,最近最少使用)算法根據資料的曆史通路記錄來進行淘汰資料,其核心思想是“如果資料最近被通路過,那麼将來被通路的幾率也更高”。

最常見的實作是使用一個連結清單儲存緩存資料,詳細算法實作如下:

[網際網路面試筆試彙總C/C++-21] FIFO 、LRU、LFU的含義、原理和實作-完美世界

1. 新資料插入到連結清單頭部;

2. 每當緩存命中(即緩存資料被通路),則将資料移到連結清單頭部;

3. 當連結清單滿的時候,将連結清單尾部的資料丢棄。

三、LFU(Least Frequently Used)算法根據資料的曆史通路頻率來淘汰資料,其核心思想是“如果資料過去被通路多次,那麼将來被通路的頻率也更高”。

LFU的每個資料塊都有一個引用計數,所有資料塊按照引用計數排序,具有相同引用計數的資料塊則按照時間排序。

具體實作如下:

[網際網路面試筆試彙總C/C++-21] FIFO 、LRU、LFU的含義、原理和實作-完美世界

1. 新加入資料插入到隊列尾部(因為引用計數為1);

2. 隊列中的資料被通路後,引用計數增加,隊列重新排序;

3. 當需要淘汰資料時,将已經排序的清單最後的資料塊删除。

注:以上圖檔摘自網絡

繼續閱讀