1. 程式人生 > >LRU(近期最少使用演算法)C++實現原始碼

LRU(近期最少使用演算法)C++實現原始碼

寫在前面

今天一同學去公司實習面試,面試官要求手寫LRU演算法,有些懵。在這裡想寫篇部落格給他作為參考,同時也給大家作為參考。

LRU(最近最少使用演算法)

LRU是CPU cache中n-way的一種替換規則(對cache不瞭解的可以檢視https://en.wikipedia.org/wiki/CPU_cache),當有新成員加入時,它需要替換近期最少被使用的cache line。

  • 雙向連結串列+雜湊表
    這種方式比較常見,如圖所示:

    新資料或擊中的資料放到連結串列頭部,表示最近使用的資料,如果連結串列滿,從尾部淘汰資料。但只用連結串列會存在一個問題,擊中資料的時間複雜度為O(n),每次需要遍歷連結串列,所以引入雜湊表,時間複雜度降到O(1),以空間換時間。
#include <list>
#include <unordered_map>
#include <cassert>   
using namespace std;  
struct Element
{
    int key;
    int value;
    Element(int k, int v):key(k), value(v){}
};
class LRUCache {
private:
    list<Element> m_list;
    unordered_map<int, list<Element>
::iterator>
m_map; int m_capacity; public: LRUCache(int capacity) { m_capacity = capacity; } int get(int key) { if (m_map.find(key) == m_map.end()) return -1; else { //將元素放入連結串列頭部 m_list.splice(m_list.begin(), m_list, m_map[key]); m_map[key] = m_list.begin(); return
m_list.begin()->value; } } void put(int key, int value) { assert(m_capacity > 0); if (m_map.find(key) != m_map.end()) { //更value m_map[key]->value = value; //將元素放入連結串列頭部 m_list.splice(m_list.begin(), m_list, m_map[key]); m_map[key] = m_list.begin(); } else if (m_capacity == m_list.size()) { m_map.erase(m_list.back().key); m_list.pop_back(); m_list.push_front(Element(key, value)); m_map[key] = m_list.begin(); } else { m_list.push_front(Element(key, value)); m_map[key] = m_list.begin(); } } }; /** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */

相關推薦

LRU近期最少使用演算法C++實現原始碼

寫在前面 今天一同學去公司實習面試,面試官要求手寫LRU演算法,有些懵。在這裡想寫篇部落格給他作為參考,同時也給大家作為參考。 LRU(最近最少使用演算法) LRU是CPU cache中n-w

最大堆最小堆C++實現原始碼

寫在前面 最近漸漸愛上寫部落格,覺得每天學到的知識需要保鮮,寫的原始碼也能及時與大家分享,接下來進入正題。 最大堆(最小堆) 最大堆(最小堆)是非常重要的資料結構,公司面試時經常會被問到,在這裡,我不會詳細介紹它的原理,而是介紹它的適用場景以及兩種寫法

Java實現LRU最近最少使用快取

前幾天去一個公司面試,面試官直接讓上機寫一個LRU快取,當時寫的很亂,現整理如下: package com.jd.test; import java.io.Serializable; import java.util.LinkedHashMap; import java.

區間圖著色問題貪心演算法C++實現

區間圖著色問題 問題描述:假設要用很多個教室對一組活動進行排程。我們希望使用盡可能少的教室來排程所有活動。請給出一個演算法,來確定哪一個活動使用哪一間教室。 這個問題也被稱為區間圖著色問題,即相容的

AVL樹自平衡樹——c++實現

html pub private 檢查 具體實現 htm lose show data- AVL樹是高度平衡的而二叉樹。它的特點是:AVL樹中任何節點的兩個子樹的高度最大差別為1。 AVL樹本質上還是一棵二叉搜索樹,它的特點是: 1.本身首先是一棵二叉

Personal deposit calculator個人存款計算器C#實現----需求分析

參考招商銀行 個人存款計算器:http://www.cmbchina.com/CmbWebPubInfo/Cal_Saving_Per.aspx?chnl=ckjsq 需求分析,先上圖,有了這張圖需求分析完成一大半了 具體存款種類 2.1 初始介面

【LeetCode】1. Two Sum兩數之和-C++實現的兩種方法

本題是一下公司的面試題: 問題描述:   問題求解: 使用無序容器unorder_map實現: #include <iostream> #include <vector> #include <cassert> #inclu

簡單工廠模式/靜態工廠模式Static Factory Method C++實現

#include <iostream> using namespace std; typedef enum ProductType { TypeA, TypeB } PRODUCTTYPE; class AbsProduct { public : virtual vo

A*演算法實現圖形化表示——C++描述

概要   A*演算法是一種啟發式尋路演算法,BFS是一種盲目的無目標的搜尋演算法,相比於BFS,A*演算法根據適應度構建優先佇列,根據適應度值可以很好的向目標點移動,具體詳情,請看搜尋相關文件,我在只是實現了在無障礙的情況下的A*演算法,有障礙的情況類似。 開發環境   visual studio 20

關於FIFO頁面淘汰演算法LRU最近最少使用演算法詳細說明

舉例說明:例如在一個虛存系統中,程序的記憶體空間為3頁,已開始記憶體為空,有以下訪問序列:2,3,2,1,5,2,4,5,3,2,5,2。分別用以上兩種方法分別計算缺頁次數。 A:使用FIFO(頁面淘汰演算法) FIFO:先進先出,也就是, 先調2(缺) 記憶體為2.

遺傳演算法Genetic Algorithm +C++實現解決TSP問題

概念 生物進化中的概念 遺傳演算法中的作用 環境 適應函式 適應性 適應函式值 適者生存 適應值大的解被保留

象棋人工智慧演算法C++實現——注重功能分割槽!!!

前言:上一期部落格我們介紹了相對簡單的士、兵、相、馬的走棋演算法,本期部落格將重點介紹比較複雜的車和炮的走棋演算法。 1.車的走棋演算法 車的走棋規則:沿直線行走。 上canMoveCHE函式的原始碼: bool Board::canMoveCHE(int movei

象棋人工智慧演算法C++實現——人工智慧的開端

前言:前面幾篇部落格詳細介紹了棋盤類的封裝、棋子類的封裝以及各種型別的棋子的走棋演算法的實現。有了前面的鋪墊,就能邁出人工智慧的第一步了。本系列部落格還是重點介紹實現方法,很多的程式碼都不再過多解釋了。 人機對戰類: #ifndef SINGLEGAME_H #defin

8種主要排序演算法C#實現

歸併排序 歸併排序也是採用“分而治之”的方式。剛發現分治法是一種演算法正規化,我還一直以為是一種需要意會的思想呢。 不好意思了,孤陋寡聞了,哈哈! 原理:將兩個有序的數列,通過比較,合併為一個有序數列。 維基入口 為方便理解,此處實現用了List<in

最近鄰插值演算法c++實現QT框架

最近鄰插值演算法是用影象中已知的畫素點填充輸出影象,採用畫素複製和畫素抽樣,使原圖放大或者縮小若干倍。 假設原影象的寬度和高度分別為 和 ,縮放後的影象的寬度為 和 ,那麼寬度和高度的縮放比例分別為:

C++實踐C++實現認證演算法:基於SHA-512的HMAC

基於SHA-512的HMAC演算法 SHA是使用最廣泛的Hash函式。其家族有SHA-1,SHA-2(包括SHA-256/SHA-384/SHA-512)。SHA1與SHA2都使用了同樣的迭代結構和模算術與二元邏輯操作。在本實驗中,我們採用SHA-512。

各種內排序演算法C++實現不斷更新中

      和很多計算機系的同學們一樣,我在大學二年級時也學了《資料結構》這門課。當時我的老師是一箇中科大的博士,現在已經是教授了。他在課上曾經這樣評價這門課:《資料結構》幾乎是所有計算機課程的基礎課,如果把這門課學好了,其他的專業課就不成問題了。還有,IT公司的面試經常涉及

排序演算法C++實現與效能分析插入排序、歸併排序、快速排序、STOOGE排序、堆排序

選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法 氣泡排序、插入排序、歸併排序和基數排序都是穩定的排序演算法。 總結: (1)如果資料量非常小,那麼適合用簡單的排序演算法:氣泡排序,選擇排序和插入排序。因為他們雖然比較次數多,但是移動次數少。比如,如果記錄的關鍵

原始碼】將一個整數的每位數分解並按逆序放入一個數組中用遞迴演算法(C語言實現)

幫朋友做的,好像是一個面試題。如果僅僅是考察遞迴的話,應該是夠了,程式的健壯性和通用性都很一般的說…… #include <stdio.h> #include <stdlib.h&g

【作業系統】頁面置換演算法最佳置換演算法C語言實現

# 【作業系統】頁面置換演算法(最佳置換演算法)(C語言實現) #####(編碼水平較菜,寫部落格也只是為了個人知識的總結和督促自己學習,如果有錯誤,希望可以指出) ## 1.頁面置換演算法: > 在地址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。當發生缺頁中斷時,如果作業系