zoukankan      html  css  js  c++  java
  • [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 };
  • 相关阅读:
    ASE19团队项目 beta阶段 model组 scrum report list
    ASE19团队项目 beta阶段 model组 scrum7 记录
    ASE19团队项目 beta阶段 model组 scrum6 记录
    ASE19团队项目 beta阶段 model组 scrum5 记录
    ASE19团队项目 beta阶段 model组 scrum4 记录
    ASE19团队项目 beta阶段 model组 scrum3 记录
    ASE19团队项目 beta阶段 model组 scrum2 记录
    ASE19团队项目 beta阶段 model组 scrum1 记录
    【ASE模型组】Hint::neural 模型与case study
    【ASE高级软件工程】第二次结对作业
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4575757.html
Copyright © 2011-2022 走看看