LRU缓存淘汰算法

手写一个LRU缓存机制算法

使用HashMap+链表

import java.util.HashMap;

/*
  * 链表          存key value
  * hashmap   存key node
 */
public class leetcode146_LRU缓存机制 {
	

	public class Node {
		public int key;
		public int value;
		public Node next;
		public Node pre;

		public Node(int k, int v) {
			this.value = v;
			this.key = k;
		}
	}

	public HashMap<Integer, Node> map;
	public Node head;
	public Node tail;
	public int capacity;

	public leetcode146_LRU缓存机制(int capacity) {
		map = new HashMap<>();
		this.capacity = capacity;
	}

	public int get(int key) {
		Node node = map.get(key);
		if (node != null) {
			remove(node);
			add(node);
			return node.value;
		}
		return -1;

	}

	// 添加到最后
	private void add(Node node) {
		Node t = tail; // 取它的尾巴
		tail = node;
		// 判断之前是否有元素
		if (t == null) {
			head = node;
		} else {
			t.next = node;
			node.pre = t;
			node.next = null;
		}
		capacity--;
	}

	// 删除
	private void remove(Node node) {
		Node pre = node.pre;
		Node next = node.next;
		if (pre == null) {
			head = next;
		} else {
			pre.next = next;
		}
		if (next == null) {
			tail = pre;
		} else {
			next.pre = pre;
		}
		capacity++;
	}

	public void put(int key, int value) {

		if (map.containsKey(key)) { // 已经存在
			Node node = map.get(key);
			node.value = value; // 更新
			remove(node);
			add(node); // 放到最后
		} else {// 不存在的情况
			Node node = new Node(key, value);

			map.put(key, node);
			add(node);
		}

		if (capacity < 0) {
			Node temp = head;
			remove(head);
			map.remove(temp.key);
		}

	}

    public static void main(String[] args) {
		leetcode146_LRU缓存机制 lru = new leetcode146_LRU缓存机制(2);
		lru.put(2, 5);
		lru.put(1, 3);
		lru.put(4, 6);
		System.out.println(lru.get(2));
		System.out.println(lru.get(1));
	}
}

 

实现LRU缓存淘汰算法的一种常用方法是使用哈希表和双向链表结合实现。具体实现步骤如下: 1. 使用一个哈希表来存储缓存中的键值对,其中键为缓存的键,值为该键对应的节点在双向链表中的指针。 2. 使用一个双向链表来存储缓存中的键值对,每个节点包含该节点对应的键、值以及前驱和后继指针。 3. 当有新的键值对被访问时,首先在哈希表中查找该键是否存在,如果存在,则将该键所对应的节点移到链表头部,表示最近被访问过;如果不存在,则在哈希表和链表中分别添加该键值对以及节点,并将该节点插入到链表头部。 4. 当缓存空间不足时,淘汰链表尾部的节点,并在哈希表中删除对应的键值对。 下面是一个Python实现的LRU缓存淘汰算法的代码示例: ```python class LRUCache: def __init__(self, capacity: int): self.capacity = capacity self.cache = {} self.head = Node(0, 0) self.tail = Node(0, 0) self.head.next = self.tail self.tail.prev = self.head def get(self, key: int) -> int: if key in self.cache: node = self.cache[key] self._remove(node) self._add(node) return node.val else: return -1 def put(self, key: int, value: int) -> None: if key in self.cache: self._remove(self.cache[key]) node = Node(key, value) self.cache[key] = node self._add(node) if len(self.cache) > self.capacity: node = self.head.next self._remove(node) del self.cache[node.key] def _add(self, node): p = self.tail.prev p.next = node node.prev = p node.next = self.tail self.tail.prev = node def _remove(self, node): p = node.prev n = node.next p.next = n n.prev = p class Node: def __init__(self, key, val): self.key = key self.val = val self.prev = None self.next = None ``` 在这个实现中,我们使用了一个双向链表来维护缓存中节点的顺序,其中head和tail分别是链表的头节点和尾节点。同时,我们使用了一个哈希表来查询节点是否存在以及快速删除节点。当有新的节点被访问时,我们将其移到链表头部,并且当缓存空间不足时,我们淘汰链表尾部的节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值