LRU Cache

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

For this problem, we need to build our own double linked list. We also need a HashMap to map the key and the node pair. To use LinkedHashMap might be a bit unfair here. Why using double linked list instead of single linked list? The reason is that after each operation of certain element, we have to move the element to the tail of the list. We also need to change the pointer of its previous element. So a previous pointer would be necessary. Besides, we add a head and a tail to help us in the implementation.

class Node {
	int key;
	int val;
	Node next;
	Node prev;
	public Node(int x, int y) {
		key = x;
		val = y;
		next = null;
		prev = null;
	}
}
public class LRUCache {
    int volume;
	int head;
	int tail;
	HashMap<Integer, Node> cacheMap;
	
	public LRUCache(int capacity) {
    	volume = capacity;
    	cacheMap = new HashMap<Integer, Node>();
    }
    public int get(int key) {
    	Node cur = cacheMap.get(key);
    	if (cur != null) {
    		// if key is in the tail, no need to move
			if (key == tail) {
				return cacheMap.get(tail).val;
			}
			// we need to update the head
			if (key == head) {
				head = cacheMap.get(head).next.key;
			}
			// remove that node
			else {
				cur.prev.next = cur.next;
			}
			cur.next.prev = cur.prev;
			// put cur in the tail
			Node tailNode = cacheMap.get(tail);
			tailNode.next = cur;
			cur.prev = tailNode;
			tail = cur.key;
			return cur.val;
		}
    	return -1;
    }
    public void set(int key, int value) {
    	Node cur = cacheMap.get(key);
    	if (cur != null) {
			cur.val = value;
			this.get(key);
		}
    	else {
    		Node insertNode = new Node(key, value);
			cacheMap.put(key, insertNode);
    		// if the map could fit a new node, we put it in and updata the tail
			if (cacheMap.size() == 1) {
				head = key;
				tail = key;
				return;
			}
			Node tailNode = cacheMap.get(tail);
			tailNode.next = insertNode;
			insertNode.prev = tailNode;
			tail = key;
			// update tail
			// check if we reach the volume
			if (cacheMap.size() > volume) {
				int newHead = cacheMap.get(head).next.key;
				cacheMap.get(newHead).prev = null;
				cacheMap.remove(head);
				head = newHead;
			}
		}
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LRU Cache是一种常见的缓存淘汰策略,LRU代表最近最少使用。在Java中,可以使用不同的方式来实现LRU Cache。 引用\[1\]中的代码展示了一种自定义的LRU Cache实现,使用了一个自定义的LRUCache类,并在main方法中进行了测试。在这个实现中,LRUCache类继承了LinkedHashMap,并重写了removeEldestEntry方法来实现缓存的淘汰策略。 引用\[2\]中的代码展示了另一种自定义的LRU Cache实现,同样使用了一个自定义的LRUCache类,并在main方法中进行了测试。这个实现中,LRUCache类同样继承了LinkedHashMap,并重写了removeEldestEntry方法来实现缓存的淘汰策略。 引用\[3\]中的代码展示了使用ArrayList实现LRU Cache的方式。在这个实现中,LRUCache类使用了一个ArrayList来存储缓存数据,并通过get和put方法来操作缓存。 总结来说,LRU Cache的Java实现可以使用自定义的类继承LinkedHashMap并重写removeEldestEntry方法,或者使用ArrayList来存储缓存数据。具体的实现方式可以根据需求和偏好选择。 #### 引用[.reference_title] - *1* *2* [Java——LRUCache](https://blog.csdn.net/m0_60867520/article/details/128361042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LRUCache的Java实现](https://blog.csdn.net/qq_39383118/article/details/103535985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值