JAVA实现LRU缓存算法,用哈希表(HashMap)降低时间复杂度
1、算法分析
上一篇我们用链表简单的实现了LRU的算法思维以及算法,我们最后分析的时间复杂度为0(n),n为链表中的长度,我们用的是单链表,单链表实现的,所有删除需要查找到对应的节点,利用哨兵的思维,监控查找的前一个节点。就能轻松实现删除。上一篇的LRU分析和简单实现
1.1利用哈希表降低时间复杂度(链表是双向链表)
有没有更好的办法来降低时间的复杂度呢?答案是利用哈希表,哈希表的key就是链表中的data,哈希表的value,存储的是每一个节点node。我们在查找和删除的时候,只需要在HashMap中找到node,然后从链表中删除node,而我们利用哈希表删除,查找,添加的时间复杂度接近O(1),
1.2 示意图
2、代码的实现
import java.util.HashMap;
import java.util.Map;
public class Chain {
public class Node{
public int data;
public Node next;
public Node pre;
}
/**
* 采用map来存储对应的节点指针,key为 输入的值,value为值所在的Node对象。
*/
private Map<Integer,Node> map=new HashMap<Integer,Node>();
/**
* 头指针 永远指向头
*
*/
private Node head=null;
/**
* 尾指针 永远指向尾
*/
private Node tail=null;
/**
* 把数据向缓存数据池中添加
* @param data data为需要缓存的数据
*/
public void LUR(int data) {
/**
* 缓存是否存在,在map中,如果存在,则删除该节点,如果不存在则在头节点插入
*/
if(map.containsKey