成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LRU(Least Recently Used)緩存算法的實現

開發 前端 算法
LRU就是Least Recently Used,即最近最少使用,是一種常用的頁面置換算法,將最近長時間未使用的頁面淘汰,其實也很簡單,就是要將不受歡迎的頁面及時淘汰,不讓它占著茅坑不拉shit,浪費資源。

[[349478]]

 LRU就是Least Recently Used,即最近最少使用,是一種常用的頁面置換算法,將最近長時間未使用的頁面淘汰,其實也很簡單,就是要將不受歡迎的頁面及時淘汰,不讓它占著茅坑不拉shit,浪費資源。

LRU是一種常見的頁面置換算法,在計算中,所有的文件操作都要放在內存中進行,然而計算機內存大小是固定的,所以我們不可能把所有的文件都加載到內存,因此我們需要制定一種策略對加入到內存中的文件進項選擇。

常見的頁面置換算法有如下幾種:

  • LRU 最近最久未使用
  • FIFO 先進先出置換算法 類似隊列
  • OPT 最佳置換算法 (理想中存在的)
  • NRU Clock置換算法
  • LFU 最少使用置換算法
  • PBA 頁面緩沖算法

LRU原理

LRU的設計原理就是,當數據在最近一段時間經常被訪問,那么它在以后也會經常被訪問。這就意味著,如果經常訪問的數據,我們需要然其能夠快速命中,而不常訪問的數據,我們在容量超出限制內,要將其淘汰。

 

 

 

 

其核心就是利用棧,進行操作,其中主要有兩項操作,get和put

get

get時,若棧中有值則將該值的key提到棧頂,沒有時則返回null

put

棧未滿時,若棧中有要put的key,則更新此key對應的value,并將該鍵值提到棧頂,若無要put的key,直接入棧

棧滿時,若棧中有要put的key,則更新此key對應的value,并將該鍵值提到棧頂;若棧中沒有put的key 時,去掉棧底元素,將put的值入到棧頂

解法:維護一個數組,提供 get 和 put 方法,并且限定 max 數量。

使用時,get 可以標記某個元素是最新使用的,提升它去第一項。put 可以加入某個key-value,但需要判斷是否已經到最大限制 max

若未到能直接往數組第一項里插入 若到了最大限制 max,則需要淘汰數據尾端一個元素。

  1. LRUCache cache = new LRUCache( 2 /* 緩存容量 */ ); 
  2.  
  3. cache.put(1, 1); 
  4. cache.put(2, 2); 
  5. cache.get(1);       // 返回  1 
  6. cache.put(3, 3);    // 該操作會使得密鑰 2 作廢 
  7. cache.get(2);       // 返回 -1 (未找到) 
  8. cache.put(4, 4);    // 該操作會使得密鑰 1 作廢 
  9. cache.get(1);       // 返回 -1 (未找到) 
  10. cache.get(3);       // 返回  3 
  11. cache.get(4);       // 返回  4 

LRU 算法設計

分析上面的操作過程,要讓 put 和 get 方法的時間復雜度為 O(1),我們可以總結出 cache 這個數據結構必要的條件:查找快,插入快,刪除快,有順序之分。

因為顯然 cache 必須有順序之分,以區分最近使用的和久未使用的數據;而且我們要在 cache 中查找鍵是否已存在;如果容量滿了要刪除最后一個數據;每次訪問還要把數據插入到隊頭。

那么,什么數據結構同時符合上述條件呢?哈希表查找快,但是數據無固定順序;鏈表有順序之分,插入刪除快,但是查找慢。所以結合一下,形成一種新的數據結構:哈希鏈表。

LRU 緩存算法的核心數據結構就是哈希鏈表,雙向鏈表和哈希表的結合體。這個數據結構長這樣:

 

 

 

 

js 實現

  • 具體代碼 一般的解法,通過維護一個數組,數組項存放了 key-value 鍵值對對象,每次需要遍歷去尋找 key 值所在的數組下標操作。

已經通過 leetCode 146 的檢測。執行用時 : 720 ms。內存消耗 : 58.5 MB。

  1. function LRUCache(capacity) { 
  2.     this.capacity = capacity;   // 最大限制 
  3.     this.cache = []; 
  4. }; 
  5.  
  6. /** 
  7.  * @param {number} key 
  8.  * @return {number} 
  9.  */ 
  10. LRUCache.prototype.get = function (key) { 
  11.     let index = this.cache.findIndex((item) => item.key === key); 
  12.     if (index === -1) { 
  13.         return -1; 
  14.     } 
  15.     // 刪除此元素后插入到數組第一項 
  16.     let value = this.cache[index].value; 
  17.     this.cache.splice(index, 1); 
  18.     this.cache.unshift({ 
  19.         key
  20.         value, 
  21.     }); 
  22.     return value; 
  23. }; 
  24.  
  25. /** 
  26.  * @param {number} key 
  27.  * @param {number} value 
  28.  * @return {void} 
  29.  */ 
  30. LRUCache.prototype.put = function (key, value) { 
  31.     let index = this.cache.findIndex((item) => item.key === key); 
  32.     // 想要插入的數據已經存在了,那么直接提升它就可以 
  33.     if (index > -1) { 
  34.         this.cache.splice(index, 1); 
  35.     } else if (this.cache.length >= this.capacity) { 
  36.         // 若已經到達最大限制,先淘汰一個最久沒有使用的 
  37.         this.cache.pop(); 
  38.     } 
  39.     this.cache.unshift({ key, value }); 
  40. }; 

上面的做法其實有變種,可以通過一個對象來存鍵值對,一個數組來存放鍵的順序。

  • 進階要求O(1)

時間復雜度 O(1),那就不能數組遍歷去查找 key 值。可以用 ES6 的 Map 來解了,因為 Map 既能保持鍵值對,還能記住插入順序。

  1. function LRUCache(capacity) { 
  2.     this.cache = new Map(); 
  3.     this.capacity = capacity;  // 最大限制 
  4. }; 
  5.  
  6. LRUCache.prototype.get = function (key) { 
  7.     if (this.cache.has(key)) { 
  8.         // 存在即更新 
  9.         let temp = this.cache.get(key); 
  10.         this.cache.delete(key); 
  11.         this.cache.set(keytemp); 
  12.         return temp
  13.     } 
  14.     return -1; 
  15. }; 
  16.  
  17. LRUCache.prototype.put = function (key, value) { 
  18.     if (this.cache.has(key)) { 
  19.         // 存在即更新(刪除后加入) 
  20.         this.cache.delete(key); 
  21.     } else if (this.cache.size >= this.capacity) { 
  22.         // 不存在即加入 
  23.         // 緩存超過最大值,則移除最近沒有使用的 
  24.         this.cache.delete(this.cache.keys().next().value); 
  25.     } 
  26.     this.cache.set(key, value); 
  27. }; 

 

責任編輯:姜華 來源: JavaScript忍者秘籍
相關推薦

2022-06-17 07:49:14

緩存LRU

2020-02-19 19:18:02

緩存查詢速度淘汰算法

2015-07-29 10:31:16

Java緩存算法

2009-07-23 11:11:18

LRU緩存

2023-07-06 12:39:14

RedisLRULFU

2020-09-18 10:31:47

LRU算法數組

2015-07-15 10:19:16

Java代碼使用緩存

2024-03-15 07:17:51

MySQLLRU算法緩存池

2021-03-01 18:42:02

緩存LRU算法

2021-07-15 14:29:06

LRU算法

2024-10-16 11:28:42

2020-05-15 17:05:51

Oracle數據庫LRU算法

2019-12-24 10:32:01

OracleLRU臟塊

2021-07-26 21:15:10

LRU緩存MongoDB

2022-05-09 19:59:15

RedisLRU 算法

2021-02-22 09:23:55

LRU時間HashMap

2021-09-05 18:29:58

Linux內存回收

2021-05-10 07:08:41

數據結構緩存

2017-04-20 09:21:44

pythonLRU算法

2012-12-17 14:54:55

算法緩存Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品精品久久久 | 久久精品国产一区二区电影 | 美国一级毛片a | 91精品国产91久久久久游泳池 | 黄色av观看| 日韩黄色av | 男女视频在线观看免费 | 日韩中文字幕久久 | 午夜av电影 | 国产99久久 | 国产在线一区二区 | 日本成人片在线观看 | 久久精品久久久久久 | 激情国产| 免费观看www| 激情欧美日韩一区二区 | 亚洲视频一区在线观看 | 蜜桃传媒一区二区 | 久久99久久久久 | 国产一区视频在线 | 日本一区二区电影 | 日韩欧美国产一区二区三区 | 欧美老少妇一级特黄一片 | 夜夜草视频 | 97av视频| 日韩国产中文字幕 | 国产精品呻吟久久av凹凸 | 亚洲欧洲国产视频 | 玖玖国产精品视频 | 日韩精品视频在线 | 国产91丝袜在线熟 | 精品国产乱码久久久久久老虎 | 成人福利在线观看 | 国产精品久久久久久久久久 | 一区二区在线免费观看 | 成人久久久 | 免费国产一区二区 | 亚洲喷水 | www.日韩系列 | 国产精品成人在线播放 | 久草免费在线视频 |