日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 小林coding
[導(dǎo)讀]大家好,我是小林。昨天發(fā)了一篇「小林手撕LRU算法」的文章,當(dāng)時這個算法寫比較趕,導(dǎo)致代碼里面有一些不對的地方,被細心的讀者發(fā)現(xiàn)了。有時候自己寫的代碼真的是當(dāng)局者迷,旁觀者清,所以codereview環(huán)節(jié)是很重要的,很難有人能一次性寫出「完美」的代碼。問題一上篇文章我說std::...

大家好,我是小林。昨天發(fā)了一篇「小林手撕 LRU 算法」的文章,當(dāng)時這個算法寫比較趕,導(dǎo)致代碼里面有一些不對的地方,被細心的讀者發(fā)現(xiàn)了。
有時候自己寫的代碼真的是當(dāng)局者迷,旁觀者清,所以 codereview 環(huán)節(jié)是很重要的,很難有人能一次性寫出「完美」的代碼。

問題一

上篇文章我說 std::map 是哈希表,這里犯了錯誤。

C 使用哈希表數(shù)據(jù)結(jié)構(gòu)的容器是 std::unordered_map,查詢效率是 O(1)。
而 std::map 的底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹,查詢效率是 O(logn)。
這兩個我常常搞混了,老是覺得有 map 字眼的容器的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,這其實是很嚴(yán)重的錯誤了,因為當(dāng)數(shù)據(jù)量非常大的時候,哈希表和紅黑樹的查詢效率的差距很快就顯現(xiàn)出來了。

問題二

在實現(xiàn) get 函數(shù)的時候,我把已經(jīng)被 erase 的迭代器,重新 push_front 到鏈表里了。

這個代碼我當(dāng)時是在 C 在線編譯網(wǎng)站運行的,當(dāng)時測試的時候沒問題。然后有個讀者反饋他跑了這個代碼發(fā)現(xiàn)會出問題。
然后,我在 Linux 環(huán)境編譯測試了下,發(fā)現(xiàn)被 erase 的迭代器,就會變成空值了,所以相當(dāng)于 push_front 了個寂寞。
因此,應(yīng)該改成重新創(chuàng)建個 pair 來存放即將被 erase 的迭代器的內(nèi)容,然后再將 pair 加入到鏈表里,如下代碼:

反思下,以后驗證代碼還是在實際環(huán)境上跑,雖然 C 在線編譯網(wǎng)站方便,但是有問題未必能發(fā)現(xiàn)出來。
把上面的問題更正后,完整版的 LRU 代碼如下

犯錯是好事。
至少我比昨天的自己更博學(xué)了些。
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉