使用 佇列陣列通過模擬棧 實現LRU快取

2021-09-03 00:25:15 字數 1544 閱讀 1670

首先明白lru演算法的意思,lru是區域性性原理的一種體現。lru演算法表示一條資料使用後,那麼下次他還可能再次被使用。當某個使用者,再次使用呼叫資料時優先拿到最近使用過的資料。

那麼這個最近使用過的資料應該如何儲存:目前我所知道的方法,使用作衡量資料活躍程度的標誌flag。如下圖表示乙個棧,如果第一次取出key,得到這個key後在快取中拿到資料,然後再將這個key加入這個棧中。這樣這個key活躍在棧頂,也就表示最近使用的。

如果這是我想取得key4這個資料,那麼取出key4,然後再壓棧,這樣key4存在棧頂中。

key4就表示了最近使用的資料。

通過上面的綜述,實現lru快取需要乙個陣列佇列來模擬乙個棧。最近加入的資料放入棧頂。

初始化陣列和資料結構。

private

int cachesize;

private map cache;

private list keylist;

/** * 初始化的構造方法

* keylist陣列佇列來模擬乙個棧

*/public

lrucachecontroller()

上面的**中,之所以使用了陣列的鍊錶的資料結構去模擬棧,是因為棧的先進後出特性促使最活躍的資料存放棧頂,陣列的連續儲存快速遍歷特性,提供訪問效能

快取中存放乙個資料時,快取的map中已經加滿,就刪除最後一條資料。也就是佇列中最早加入的資料也就是第一條。取出第一條後,取出的資料就是map快取的key,然後拿到這個key在快取map中刪掉。

public

void

putobject

(object key, object value)

catch

(indexoutofbound***ception e)

}}

獲取到乙個資料方法。如果第一次取出key,得到這個key後再快取中拿到資料,然後再將這個key壓入keylist棧中。這樣這個key活躍在keylist棧頂,也就表示最近使用的。

public object getobject

(object key)

return result;

}

結論:keylist表示乙個flag,標識著哪些資料應該被淘汰,也就是由這個keylist棧去控制,他們的活躍程度,根據在keylist的位置判斷是否活躍,如果第乙個0下標裡,是沒有被使用過的,可以被淘汰的。

水平原因可能存在錯誤,希望指正 [email protected]

使用陣列模擬佇列 迴圈佇列和棧

在一些考試題中以及筆試面試的過程中,在需要使用stack和queue的時候,可能被要求不能使用stl中相關的庫函式,也就意味著我們需要使用純c進行程式設計。但是如果在考試中或者筆試面試中,為了要使用棧和佇列,而去寫乙個完整的資料結構是比較大費周章,況且在時間上也不一定允許,因此,使用陣列來模擬棧和佇...

使用陣列實現棧,使用單向鍊錶實現佇列

棧 源 使用陣列實現棧的 出棧 入棧 返回棧頂元素 取得棧的大小 及棧的複製 最重要的是定義結構體,結構體內部兩個屬性,乙個 int 型陣列,乙個 top 表示陣列內的有效資料為 top 個。include include include typedef int datetype define ma...

陣列模擬棧的實現

思路分析 1 使用陣列來模擬棧 2 定義乙個top來表示棧頂,初始化為 1 3 入棧操作 當有資料加入棧時,top 1,stack top data 4 入棧操作 當資料被取出時,int value stack top top 1,return value 現在開始寫實現 class arrayst...