美文网首页
lintcode-LRU缓存策略

lintcode-LRU缓存策略

作者: 鬼谷神奇 | 来源:发表于2016-06-04 20:58 被阅读225次

使用双链表和hashtable数据结构,双链表负责更新最近访问的数据节点到头部,hashtable负责查找、修改或添加、删除

import java.util.*;

public class Solution {
    private int capacity;
    private int currentSize;
    private Hashtable nodes;
    private CacheNode first;
    private CacheNode last;
    
    class CacheNode {
        CacheNode prev;
        CacheNode next;
        int key;
        int value;
        
        CacheNode() { 
            this.prev = this.next = null;
        }
    };

    // @param capacity, an integer
    public Solution(int capacity) {
        // write your code here
        this.capacity = capacity;
        this.currentSize = 0;
        this.nodes = new Hashtable(capacity);
        this.first = null;
        this.last = null;
    }

    // @return an integer
    public int get(int key) {
        // write your code here
        CacheNode node = (CacheNode)nodes.get(key);
        if(node != null) {
            moveToHead(node);
            return node.value;
        }
        
        return -1;
    }

    // @param key, an integer
    // @param value, an integer
    // @return nothing
    public void set(int key, int value) {
        // write your code here
        CacheNode node = (CacheNode)nodes.get(key);
        
        if(node == null) {
            if(currentSize < capacity) {
                currentSize++;
            } else {
                if(last != null) {
                    nodes.remove(last.key);
                    removeLast();
                }
            }
            
            node = new CacheNode();
        }
        
        node.key = key;
        node.value = value;
        moveToHead(node);
        nodes.put(key, node);
    }
    
    
    public void moveToHead(CacheNode node) {
        if(first == node) {
            return;
        }
        
        if(node.prev != null) {
            node.prev.next = node.next;
        }
        
        if(node.next != null) {
            node.next.prev = node.prev;
        }
        
        if(last == node) {
            last = node.prev;
        }
        
        if(first != null) {
            node.next = first;
            first.prev = node;
        }
        
        first = node;
        node.prev = null;
        
        if(last == null) {
            last = first;
        }
        
    }
    
    public void removeLast() {
        if(first == last) {
            first = last = null;
        } else {
            if(last.prev != null) {
                last.prev.next = null;
                last = last.prev;
            }
        }
    }
}

相关文章

  • lintcode-LRU缓存策略

    使用双链表和hashtable数据结构,双链表负责更新最近访问的数据节点到头部,hashtable负责查找、修改或...

  • OkHttp3(十二)--CacheInterceptor

    CacheInterceptor 用来负责读取缓存以及更新缓存的 读取候选缓存 创建缓存策略 根据缓存策略决定报错...

  • cell 图片缓存策略

    无沙盒路径缓存策略 有沙盒路径缓存策略

  • Gradle 缓存目录结构 缓存策略

    [TOC] gradle 缓存策略 Gradle 的缓存策略中,对于 SNAPSHOT 版本默认的缓存周期是 24...

  • gradle缓存

    gradle缓存策略 Gradle 的缓存策略中,对于 SNAPSHOT 版本默认的缓存周期是 24 小时,也就是...

  • HTTP的协商缓存策略

    http缓存策略 - 协商缓存(对比缓存) 服务器端缓存策略(即判断是否可以缓存)服务端判断一个资源是否被缓存服务...

  • 电商高并发秒杀4 缓存库存异步化与事务型消息

    1、高效交易验证 用户风控策略优化:策略缓存模型优化 策略缓存模型化,将对应的风控内容做到redis缓存里面,例如...

  • Okhttp3之缓存与CacheInterceptor

    一、缓存的流程 读取缓存 创建缓存策略 根据策略,在不使用网络的情况下没有缓存,返回504报错 HttpGatew...

  • 【干货】前端Nginx统一配置

    一、缓存策略 项目入口文件index.html 不缓存,其他静态资源js、css、font、img等走缓存策略,具...

  • 实践缓存策略

    NSURLRequestUseProtocolCachePolicy 有缓存就默认优先利用缓存,默认缓存策略。具...

网友评论

      本文标题:lintcode-LRU缓存策略

      本文链接:https://www.haomeiwen.com/subject/qegldttx.html