虎牙面試演算法題 使用map為容器實現LRU演算法

2021-08-28 08:32:08 字數 980 閱讀 4322

所以為了看我文章的人不會遭遇同樣的問題,

2.盡可能循序漸進(還是看不懂可能是我沒有這樣的天賦),標出閱讀的前提知識

3.列出的**自己先跑一遍

c++1.map

2.queue

整合開發環境:visual studio 2017

最近在虎牙一面時,被面試官問到的一道演算法題——使用map為容器實現lru演算法。

lru,least recently used,最近最少使用頁面換出演算法,常用於頁面置換演算法,是為虛擬頁式儲存管理服務的。

當時第一想法是加上個序號,然後遍歷map將序號小的換出,所以就想著將序號作為鍵,但是當時就被指出這樣就抹殺了map的優勢無法快速找到所需頁面。

然後又想著另開乙個佇列儲存相應的鍵,容量超出時先進的鍵當然先出,但是這樣又有乙個問題,還是當頁面重複使用時它必須重新回到隊尾,而無法快速找到重複頁面鍵的這一想法被否決了。

當時還是太年輕了,過於緊張腦子一片空白,想了個低效的方法,再開乙個map,使用頁面的鍵來存頁面最近使用的時間順序,這樣能快速更新序號,但是換出頁面時還是得遍歷這個儲存序號的map太過於低效。

現在仔細想想,還是非常簡單的問題,雖說可能不是最好的解決方法,但比起上面的方法還是比較有效率的。

思路:使用結構體將頁面資料報起來的同時加上使用計數,map儲存這個結構體,另開乙個佇列,當頁面被使用則將鍵值入隊,當map滿了後則不斷出隊,每次出隊就對鍵值相應的mydata使用計數-1,當使用計數歸0時從map中刪除,直至map有空餘的容量。

下面為偽**:

struct mydata

};int main()

}return 0;

}

當初想利用shared_ptr的自定義deleter和引用計數來實現上述演算法,但是發現只有複製share_ptr複製時引用計數才會自增,就算儲存的指標數值一樣引用計數也不會自增,所以最後自己使用了乙個結構體來進行使用計數,實現最近未使用的頁面換出。

傳送(也是我)

面試演算法題

前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...

面試演算法題

1 直方圖矩形最大值 class solution s.push i return res 2 第n個醜數 class solution return res.back 3 lru cache 最近最少使用頁面置換快取器 class lrucache int get int key void set...

某個面試演算法題

援引某人部落格 有乙個整數n,寫乙個函式f n 返回0到n之間出現的 1 的個數。比如f 13 6,現在f 1 1,問下乙個最大的f n n的n是什麼?writed by chszs public void fn int inputval 1000000 int cntforone 0 long c...