1. 程式人生 > >【連結串列】實現LRU快取策略LRU Cache

【連結串列】實現LRU快取策略LRU Cache

題目:設計一個最近使用的快取資料結構,其須支援get和put兩種操作

get(key):如果LRU中key存在,則返回其值,否則返回-1;

put(key,value):如果key存在,則改變其值為value,否則插入一個新的key,value。當快取容量達到上限,需要在插入新的元素之前刪去其中最近未使用的元素。

C++實現(C++ 11)https://discuss.leetcode.com/topic/6812/c-11-code-74ms-hash-table-list

class LRUCache {
public:
    LRUCache(int capacity) : _capacity(capacity) {}
    
    int get(int key) {
        auto it = cache.find(key);
        if (it == cache.end()) return -1;
        touch(it);
        return it->second.first;
    }
    
    void set(int key, int value) {
        auto it = cache.find(key);
        if (it != cache.end()) touch(it);
        else {
			if (cache.size() == _capacity) {
				cache.erase(used.back());
				used.pop_back();
			}
            used.push_front(key);
        }
        cache[key] = { value, used.begin() };
    }
    
private:
    typedef list<int> LI;
    typedef pair<int, LI::iterator> PII;
    typedef unordered_map<int, PII> HIPII;
    
    void touch(HIPII::iterator it) {
        int key = it->first;
        used.erase(it->second.second);
        used.push_front(key);
        it->second.second = used.begin();
    }
    
    HIPII cache;
    LI used;
    int _capacity;
};


相關推薦

連結串列實現LRU快取策略LRU Cache

題目:設計一個最近使用的快取資料結構,其須支援get和put兩種操作 get(key):如果LRU中key存在,則返回其值,否則返回-1; put(key,value):如果key存在,則改變其值為value,否則插入一個新的key,value。當快取容量達到上限,需要在插

連結串列實現單鏈表的逆序

1 public class Main { 2 3 // 就地逆序法 4 public Node reverse(Node head) { 5 // no need to reverse 6 if (head == null || head.

莫隊連結串列三校聯考1015T3

題意: 分析: 啊啊啊啊我發明的演算法居然以前有過。。。。https://blog.csdn.net/qq_34454069/article/details/80184286 方法其實很簡單。。。首先,把所有未加入的點放在一個雙向連結串列裡。 然後,每次插入一

Leetcode連結串列 19. Remove Nth Node From End of List / 刪除連結串列的倒數第N個節點

Given a linked list, remove the n-th node from the end of list and return its head. Example: Given linked list: 1->2->3->4->5, and

連結串列有序連結串列中移除重複項

1 public class Main { 2 3 public Node removeDup(Node node){ 4 5 if (node == null || node.next == null || node.next.next == null){ 6

LeetCode138Copy List with Random Pointer連結串列

題目:A linked list is given such that each node contains an additional random pointer which could point

LeetCode148Sort List連結串列

class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode sortList(ListNod

LeetCode109Convert Sorted List to Binary Search Tree連結串列

題目:Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. For this problem,

資料結構連結串列HDU6375 度度熊學佇列

分析: 連結串列真好。。。。 不用管中間到底誰前誰後。只需要保證兩端是合法的。 這樣反正你都得從兩端縮到中間去,縮的時候判斷一下,如果是刪去右端點,那麼判斷右端點的左端點的右指標:是否為當前刪去的點,不

刷題練習記錄(2)——兩數相加(JAVA 和 Python)連結串列

【2】兩數相加 給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 單位 數字。 如果,我們將這兩個數起來相加起來,則會返回出一個新的連結串列來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例:

LeetCode445Add Two Numbers II連結串列

題目:You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each

資料結構——連結串列

最基礎的動態資料結構:連結串列 Java中線性資料結構包括:陣列、棧、佇列【這三者底層都是基於動態陣列實現的,實現動態的機制依靠resize()動態擴容】、連結串列【真正的動態資料結構】。   連結串列可以分為單向連結串列和雙向連結串列。連結串列中的資料都儲存在Node節點中,

連結串列奇怪的體育老師

奇怪的體育老師(sports.cpp) 題目描述 某班上體育課,已經有部分同學排成一列縱隊,對於後面來的同學,體育老師將他們隨機的插入到某個位置,他的指令為“b K”或者“a K”:表示將後來的同學插入到第K個同學的前面或後面。 n,m<=10000,每個人的名字不超過10個字元。  

LeetCode86Partition List連結串列

題目:Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. Yo

LeetCode328Odd Even Linked List連結串列

題目:Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the n

02-線性結構1 兩個有序連結串列序列的合併連結串列

題意:將倆個遞增連結串列合併成非遞減連結串列,注意提交程式碼時只需提交合並函式! 思路:就是最基本的連結串列操作。。。 程式碼: #include <stdio.h> #include

連結串列兩個單鏈表求差集

問題描述 已知集合A和B的元素分別用不含頭結點的單鏈表儲存,函式difference()用於求解集合A與B的差集,並將結果儲存在集合A的單鏈表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成計算後A={10,20

連結串列C++刪除連結串列中重複的結點

題目: 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4-&

Linux核心連結串列整理筆記(2)

    關於連結串列我們更多時候是對其進行遍歷的需求,上一篇博文裡我們主要認識了一下和連結串列操作比較常用的幾個核心API介面,其入參全都是清一色的struct list_head{}型別。至於連結串列的遍歷,核心也有一組基本的介面(其實都是巨集定義的)供開發者呼叫。

資料結構·連結串列·JAVA版

和C++並沒有差別不大,主要是指標改為了引用變數,其他的鏈式結構基本可以參照這個 至於樹的話注意下遞迴就大致可以了 package com.sun.study.test; class Link{