虎牙面試算法題:使用map為容器實(shí)現(xiàn)LRU算法

前言:

因?yàn)樽约翰殚單恼聲r(shí)經(jīng)常遇到缘挽,這些問(wèn)題:因?yàn)榄h(huán)境不同而導(dǎo)致結(jié)果不一致蔫劣、因?yàn)槲恼绿S度太大而導(dǎo)致無(wú)法理解诡必、因?yàn)槲恼麓a運(yùn)行結(jié)果不同而苦惱脊框。

所以為了看我文章的人不會(huì)遭遇同樣的問(wèn)題,

以后我的文章將遵循以下原則:

1.會(huì)在文章開頭標(biāo)明相關(guān)配置與環(huán)境

2.盡可能循序漸進(jìn)(還是看不懂可能是我沒(méi)有這樣的天賦),標(biāo)出閱讀的前提知識(shí)

3.列出的代碼自己先跑一遍

////////////////////////////////////////

語(yǔ)言:c++

前提知識(shí):

1.map

2.queue

集成開發(fā)環(huán)境:Visual Studio 2017

////////////////////////////////////////

最近在虎牙一面時(shí),被面試官問(wèn)到的一道算法題——使用map為容器實(shí)現(xiàn)LRU算法壹若。

LRU,Least Recently Used屿储,最近最少使用頁(yè)面換出算法,常用于頁(yè)面置換算法硬萍,是為虛擬頁(yè)式存儲(chǔ)管理服務(wù)的。

當(dāng)時(shí)第一想法是加上個(gè)序號(hào)围详,然后遍歷map將序號(hào)小的換出朴乖,所以就想著將序號(hào)作為鍵,但是當(dāng)時(shí)就被指出這樣就抹殺了map的優(yōu)勢(shì)無(wú)法快速找到所需頁(yè)面助赞。

然后又想著另開一個(gè)隊(duì)列存儲(chǔ)相應(yīng)的鍵买羞,容量超出時(shí)先進(jìn)的鍵當(dāng)然先出,但是這樣又有一個(gè)問(wèn)題雹食,還是當(dāng)頁(yè)面重復(fù)使用時(shí)它必須重新回到隊(duì)尾畜普,而無(wú)法快速找到重復(fù)頁(yè)面鍵的這一想法被否決了。

當(dāng)時(shí)還是太年輕了群叶,過(guò)于緊張腦子一片空白吃挑,想了個(gè)低效的方法,再開一個(gè)map街立,使用頁(yè)面的鍵來(lái)存頁(yè)面最近使用的時(shí)間順序舶衬,這樣能快速更新序號(hào),但是換出頁(yè)面時(shí)還是得遍歷這個(gè)存儲(chǔ)序號(hào)的map太過(guò)于低效赎离。

現(xiàn)在仔細(xì)想想逛犹,還是非常簡(jiǎn)單的問(wèn)題,雖說(shuō)可能不是最好的解決方法梁剔,但比起上面的方法還是比較有效率的虽画。

思路:

使用結(jié)構(gòu)體將頁(yè)面數(shù)據(jù)包起來(lái)的同時(shí)加上使用計(jì)數(shù),map存儲(chǔ)這個(gè)結(jié)構(gòu)體荣病,另開一個(gè)隊(duì)列码撰,當(dāng)頁(yè)面被使用則將鍵值入隊(duì),當(dāng)map滿了后則不斷出隊(duì)个盆,每次出隊(duì)就對(duì)鍵值相應(yīng)的Mydata使用計(jì)數(shù)-1灸拍,當(dāng)使用計(jì)數(shù)歸0時(shí)從map中刪除做祝,直至map有空余的容量。

下面為偽代碼:

struct Mydata

{

? ? size_t num;//使用計(jì)數(shù)

? ? int data;//存儲(chǔ)數(shù)據(jù)

Mydata(size_t _num) :num(_num), data(1) {}

};

int main()

{

using omap = std::unordered_map<int, Mydata>;

omap _map;

omap::iterator it;

std::queue<int> que;

while(...)

{

/*

獲取頁(yè)面

計(jì)算使用頁(yè)面鍵值為x

*/

if(it=_map.find(x)鸡岗!=_map.end())//頁(yè)面是否在map中

//++it->second.num;//是則使用次數(shù)+1

else?_map.insert(std::make_pair<int,Mydata>(x,Mydata(1)));否則頁(yè)面插入map中

//que.push(x);鍵值插入queue中

while(_map.size()>=頁(yè)面容量)//直到map空出空間

{

it = _map.find(que.front());

if (!--it->second.num)_map.erase(it);//使用次數(shù)歸0則刪除

que.pop();

}

}

return 0;

}

總結(jié):

當(dāng)初想利用shared_ptr的自定義deleter和引用計(jì)數(shù)來(lái)實(shí)現(xiàn)上述算法混槐,但是發(fā)現(xiàn)只有復(fù)制share_ptr復(fù)制時(shí)引用計(jì)數(shù)才會(huì)自增,就算存儲(chǔ)的指針數(shù)值一樣引用計(jì)數(shù)也不會(huì)自增轩性,所以最后自己使用了一個(gè)結(jié)構(gòu)體來(lái)進(jìn)行使用計(jì)數(shù)声登,實(shí)現(xiàn)最近未使用的頁(yè)面換出。

如果還有什么更高效的算法揣苏,請(qǐng)?jiān)谠u(píng)論中告訴我悯嗓,感謝閱讀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卸察,隨后出現(xiàn)的幾起案子脯厨,更是在濱河造成了極大的恐慌,老刑警劉巖坑质,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件合武,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涡扼,警方通過(guò)查閱死者的電腦和手機(jī)稼跳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吃沪,“玉大人汤善,你說(shuō)我怎么就攤上這事∑北耄” “怎么了红淡?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)降铸。 經(jīng)常有香客問(wèn)我锉屈,道長(zhǎng),這世上最難降的妖魔是什么垮耳? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任颈渊,我火速辦了婚禮,結(jié)果婚禮上终佛,老公的妹妹穿的比我還像新娘俊嗽。我一直安慰自己,他們只是感情好铃彰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布绍豁。 她就那樣靜靜地躺著,像睡著了一般牙捉。 火紅的嫁衣襯著肌膚如雪竹揍。 梳的紋絲不亂的頭發(fā)上敬飒,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音芬位,去河邊找鬼无拗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昧碉,可吹牛的內(nèi)容都是我干的英染。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼被饿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼四康!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起狭握,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闪金,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后论颅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哎垦,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嗅辣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撼泛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠说。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澡谭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出损俭,到底是詐尸還是另有隱情蛙奖,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布杆兵,位于F島的核電站雁仲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琐脏。R本人自食惡果不足惜攒砖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望日裙。 院中可真熱鬧吹艇,春花似錦、人聲如沸昂拂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)格侯。三九已至鼻听,卻和暖如春财著,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撑碴。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工撑教, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灰羽。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓驮履,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親廉嚼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玫镐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容