實現乙個 O 1 查詢的 LRU Cache

2021-07-22 08:05:20 字數 1492 閱讀 2223

簡單來說 lru 是記憶體管理的一種演算法,淘汰最近不用的頁。

o(1) 時間完成查詢,那除了 hash 別無選擇。lru 用雙向鍊錶實現即可。資料結構選擇好了,查詢我們用 hash 通過 key 得到鍊錶節點的位置,然後更新 lru 鍊錶即可。

簡單說下自己的專案,乙個類似 memcache 的小型資料庫。

當時和 memcache 設計不同的一點是沒有將所有 slab 上的 item 串到一起。而是將 slab 串成乙個鏈,每個 slab 有自己的 free item list 和 alloc item list,當前 slab 鎖如果被占用,自旋若干次,還失敗則到下乙個 slab 嘗試獲取鎖,避免阻塞。這樣減小鎖的顆粒度,在併發情況下效能應該會好些。每個 slab 的 alloc item list 就是乙個 lru cache。若 free item 分配完時,則通過 hashmap 來找到 alloc item list 上的節點,完成 lru 策略。

看**吧,這裡簡單的將 item 設定成key value 都為 string 的乙個 pair。

hodis_lru.h

#include 

#include

#include

#include

#include

#include

#include

#include

namespace hodis ;

} /* hodis */

hodis_lru.cpp

#include "hodis_lru.h"

namespace hodis

lrucache::~lrucache()

void

lrucache::set(const

std::string &key, const

std::string &value));

}else else );}}

}std::string

lrucache::get(const

std::string &key) else

}void

lrucache::foreach()

std::cout

<< std::endl;

}} /* hodis */

測試**:

#include 

#include "hodis_lru.h"

int main()

執行結果如下:

當到達 lru max size 時,進行 lru 演算法。

實現乙個在O 1 內提供min操作的棧

題目 正如本文題目所示,要求實現乙個除了push,pop之外,還提供乙個在o 1 時間內給出堆疊內最小的數值的操作。解析1 對於這個問題,我們可以從堆疊節點儲存的資訊入手。通常堆疊的節點只儲存乙個資料物件,為了能夠在o 1 的時間內找到堆疊內最小的值,我們可以在每個堆疊節點內儲存乙個min值,用於指...

高階篇 設計乙個O(1)的資源池

設計乙個資源池,以下三個操作滿足o 1 複雜度 1 從未分配的資源中分配一塊資源 2 從已分配的資源中釋放指定資源 3 隨機訪問一塊已分配的資源。大致意思是這樣。class resourcepool def init self,cap self.rc i 1 for i in range cap s...

實現push pop min皆為O(1)的棧

前些時間筆試,遇到這樣一道題,要求實現乙個push pop min操作皆為o 1 的棧。當時想到的是使用堆或者紅黑樹維護最小值,這顯然都是無法達到o 1 要求的。後來參考網上思路,實現邏輯也很簡潔,就是使用另乙個棧維護乙個最小元素集 include include include using nam...