設計LRU快取結構

2021-10-11 15:47:00 字數 2389 閱讀 1004

設計lru快取結構

設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能

[要求]

set和get方法的時間複雜度為o(1)

某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。

當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。

輸入描述:

第一行兩個個整數n, k,表示運算元量以及快取結構大小

接下來n行,第一行乙個整數opt表示操作型別。

若opt=1,接下來兩個整數x, y,表示set(x, y)

若opt=2,接下來乙個整數x,表示get(x),若x未出現過或已被移除,則返回-1

輸出描述:

對於每個操作2,輸出乙個答案

示例1輸入

6 3

1 1 1

1 2 2

1 3 2

2 11 4 4

2 2

輸出
1

-1

說明
第一次操作後:最常使用的記錄為("1", 1)

第二次操作後:最常使用的記錄為("2", 2),("1", 1)變為最不常用的

第三次操作後:最常使用的記錄為("3", 2),("1", 1)還是最不常用的

第四次操作後:最常用的記錄為("1", 1),("2", 2)變為最不常用的

第五次操作後:大小超過了3,所以移除此時最不常使用的記錄("2", 2),加入記錄("4", 4),並且為最常使用的記錄,然後("3", 2)變為最不常使用的記錄

備註:

1 ⩽k

⩽n⩽1

05

1 \leqslant k \leqslant n \leqslant 10^5

1⩽k⩽n⩽

105−2∗

109⩽

x,y⩽

2∗10

9-2 * 10^9 \leqslant x, y \leqslant 2 * 10^9

−2∗109

⩽x,y

⩽2∗1

09題解:雙向鍊錶和雜湊表配合。假設雙向鍊錶從尾部到首部使用優先順序依次遞減,那麼:

同時需要使用雜湊表記錄每個 key 對應的節點,方便修改和刪除。

**(非基於物件):

#include

#include

using

namespace std;

const

int n =

100010

;typedef pair<

int,

int> pii;

int e[n]

, l[n]

, r[n]

;int n, k, idx;

int tot;

unordered_map<

int, pii> k2v;

void

init()

void

add(

int key,

int val )

;++tot;

}void

remove

(int k )

void

change

(int k )

intmain

(void

)else}}

return0;

}

**(基於物件)
#include

#include

#include

using

namespace std;

template

<

class

key_t

,class

value_t

>

class

lruvoid

set(

int key,

int value )

else);

if( lst.

size()

> max_size )}}

value_t get

( key_t key )

else

}private

:using key_value_pair = pair

;using list_iterator =

typename list

::iterator;

size_t max_size;

list lst;

unordered_map hash_map;};

intmain

(void

)else

}return0;

}

設計LRU快取結構

設計lru快取結構 描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。若o...

LRU快取設計

設計乙個lru演算法 最近最少移除 來實現快取 思路 public class lrucache 刪除中間節點 public void remove string key 刪除節點 param node public string removenode node node else if node ...

NC93 設計LRU快取結構

知識點 雜湊表 鍊錶 題目鏈結 題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。當快取的大小超過k時,移除最不經常使用的記錄,即set或ge...