• [LeetCode][JavaScript]LRU Cache


    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.

    https://leetcode.com/problems/lru-cache/


    最近最少使用。

    开一个容量为capacity的容器,如果最近访问过(get和set都算访问),就把这个元素放到第一个,超出capacity就删掉最后一个元素。

    我这边用了js的数组,可以AC,但比较慢,用链表可以快一些,主要是移除数组里指定元素的操作费时:

     this.queue = this.queue.slice(0,i).concat(this.queue.slice(i + 1));

    另开一个set对象记录在队列中的元素,以空间换时间,这样查找元素的效率就是O(logn)

     1 /**
     2  * @constructor
     3  */
     4 var LRUCache = function(capacity) {
     5     this.capacity = capacity;
     6     this.keyMap = new Set();
     7     this.queue = []; 
     8 };
     9 
    10 /**
    11  * @param {number} key
    12  * @returns {number}
    13  */
    14 LRUCache.prototype.get = function(key) {
    15     if(this.keyMap.has(key)){
    16         for(var i = 0; i < this.queue.length; i++){
    17             if(this.queue[i].key === key){
    18                 var value = this.queue[i].value;
    19                 this.queue = this.queue.slice(0,i).concat(this.queue.slice(i + 1));
    20                 this.queue.unshift({key : key, value : value}); 
    21                 return value;
    22             }
    23         }
    24     }
    25     return -1;
    26 };
    27 
    28 /**
    29  * @param {number} key
    30  * @param {number} value
    31  * @returns {void}
    32  */
    33 LRUCache.prototype.set = function(key, value) {
    34     if(this.keyMap.has(key)){
    35         var index = -1;
    36         for(var i = 0; i < this.queue.length; i++){
    37             if(this.queue[i].key === key){
    38                 index = i;
    39                 break;
    40             }
    41         }
    42         this.queue = this.queue.slice(0,index).concat(this.queue.slice(index + 1));
    43     }else{
    44         this.keyMap.add(key);
    45     }
    46     this.queue.unshift({key : key, value : value}); 
    47 
    48     if(this.queue.length > this.capacity){
    49         var pop = this.queue.pop();
    50         this.keyMap.delete(pop.key);
    51     }
    52 };
  • 相关阅读:
    JSP基础语法
    Tomcat服务器的安装及配置
    数据库连接失败出现4064错误
    错误页跳转
    Eclipse配置jstl标准标签库详解
    tomcat文件目录结构及功能介绍
    警告: [SetPropertiesRule]{Context/Loader} Setting property 'useSystemClassLoaderAsParent' to 'false' did not find a matching property.
    tomcat:A docBase * inside the host appBase has been specifi, and will be ignored
    Prim算法
    (值类型引用类型)和null的关系
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4575757.html
Copyright © 2020-2023  润新知