zoukankan      html  css  js  c++  java
  • LeetCode LRU缓存算法

    LRU 是 Least Recently Used 的缩写,即最近最少使用,是一种常用的页面置换算法,选择内存中最近最久未使用的页面予以淘汰。

    可用的 NodeJS 库见node-lru-cache

    然怎么使用 JS 简单写一个?类似的题目见 LeetCode 146 LRU 缓存机制,进阶要求时间复杂度 O(1) 。

    思路

    解法:维护一个数组,提供 get 和 put 方法,并且限定 max 数量。

    使用时,get 可以标记某个元素是最新使用的,提升它去第一项。put 可以加入某个key-value,但需要判断是否已经到最大限制 max

    • 若未到能直接往数组第一项里插入
    • 若到了最大限制 max,则需要淘汰数据尾端一个元素。

    通过维护一个Map对象,因为 Map 既能保持键值对,还能记住插入顺序。

    /**
     * @param {number} capacity
     */
    var LRUCache = function(capacity) {
      this.catch = new Map()
      this.capacity = capacity
    };
    
    /** 
     * @param {number} key
     * @return {number}
     */
    LRUCache.prototype.get = function(key) {
      if(this.catch.has(key)) {
        // 存在即更新
        let temp = this.catch.get(key)
        this.catch.delete(key)   // 从底部删除
        this.catch.set(key, temp)  // 插入到顶部
        return temp
      }
      // 不存在返回-1
      return -1
    };
    
    /** 
     * @param {number} key 
     * @param {number} value
     * @return {void}
     */
    LRUCache.prototype.put = function(key, value) {
      if(this.catch.has(key)) {
        // 存在就更新,,先删除后加入
        this.catch.delete(key)
      }else if(this.catch.size >= this.capacity) {  // 不存在就需要加入
        // 先判断内存是否超过最大值
        this.catch.delete(this.catch.keys().next().value)
      }
      this.catch.set(key, value)
    };
  • 相关阅读:
    18天,也能让ERP步入新世界
    VB.NET显示Internet上的图片
    首页增强外挂 vBulltein 3.5.x/3.6.x
    简繁互相切换的字库(比较全)
    delphi 使用者的一个好工具
    sql语句的一些参考
    错误2203,安装中的用户权限问题
    音响的灵魂! 世界顶级扬声器品牌介绍
    Pocket PC程序安装
    清理数据库挂马代码
  • 原文地址:https://www.cnblogs.com/lyt0207/p/14000715.html
Copyright © 2011-2022 走看看