腾讯面试真题:
口述如何实现LRU算法。
我自己用优先队列和小顶堆两种方法实现的,面试官问我有没有O(1)的方法,我不知道,然后发给我一个链接让我研究研究,说这个方法知道的人并不多…
讲解:
http://dreamtracer.top/lrucache/
网络上好像只找到了java和swift实现,我模仿这些代码的思路,用C++实现该算法。
C++实现:
#include <iostream>
#include <unordered_map>
using namespace std;
/**
* LRUCache算法:最近最少使用算法
* 核心算法实现:散列表+双向链表
* 算法核心功能:
* 1.添加缓存(先判断散列表中是否存在该缓存,如果存在,则将该缓存移动到链尾。
* 如果不存在,则先判断链表是否已经满了,如果满了则先把头结点删除,未满则直接插到链尾)
* 2.查找缓存(因为是散列表,所以时间复杂度,接近O(1))
* 3.删除缓存
*/
struct Node{
string key;
string value;
Node *pre;
Node *next;
Node(string key, string value){
this->key = key;
this->value = value;
}
};
class LRUCashe{
public:
// 设置缓存大小,默认为10
void setCasheSize(int casheSize){
this->casheSize = casheSize;
}
void addCashe(string key, string value){
if (map.find(key) != map.end()) {
// 哈希表中存在该节点
Node *node