最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

使用PHP實現(xiàn)LRU緩存淘汰算法

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 14:43:27
文檔

使用PHP實現(xiàn)LRU緩存淘汰算法

使用PHP實現(xiàn)LRU緩存淘汰算法:LRU(cache)LRU 介紹緩存是一種提高數(shù)據(jù)讀取性能的技術(shù)。但是對于計算機來說,并不可能緩存所有的數(shù)據(jù),在達(dá)到它的臨界空間時,我們需要通過一些規(guī)則用新的數(shù)據(jù)取代掉一部分的緩存數(shù)據(jù)。這時候你會如果選擇替換呢?替換的策略有很多種,常用的有以下幾種:●
推薦度:
導(dǎo)讀使用PHP實現(xiàn)LRU緩存淘汰算法:LRU(cache)LRU 介紹緩存是一種提高數(shù)據(jù)讀取性能的技術(shù)。但是對于計算機來說,并不可能緩存所有的數(shù)據(jù),在達(dá)到它的臨界空間時,我們需要通過一些規(guī)則用新的數(shù)據(jù)取代掉一部分的緩存數(shù)據(jù)。這時候你會如果選擇替換呢?替換的策略有很多種,常用的有以下幾種:●
LRU(cache)

LRU 介紹

緩存是一種提高數(shù)據(jù)讀取性能的技術(shù)。但是對于計算機來說,并不可能緩存所有的數(shù)據(jù),在達(dá)到它的臨界空間時,我們需要通過一些規(guī)則用新的數(shù)據(jù)取代掉一部分的緩存數(shù)據(jù)。這時候你會如果選擇替換呢?

替換的策略有很多種,常用的有以下幾種:

● FIFO (先進(jìn)先出策略)

● LFU (最少使用策略)

● LRU (最近最少使用策略)

● NMRU (在最近沒有使用的緩存中隨機選擇一個替換)

介于我這篇主要實現(xiàn) LRU,所以就不去介紹其他的了,可以自行去了解。

假設(shè)你已經(jīng)有 5 個女朋友了,此時你成功勾搭上一個新女朋友,在你沉迷女色的同時,你驚奇的發(fā)現(xiàn),你已經(jīng)不能像年輕時一樣以一敵六了,你必須舍棄若干個女朋友,這時候,身擁六個女朋友的渣男你,徹底展示出你的渣男本色,和最近最少秀恩愛的小姐姐說再見:“對不起,國籃此時需要我挺身發(fā)邊線球,我楠辭琦咎,再見。”,就這樣在你成功勾搭一個新小姐姐,你的身體臨界點的同時,你就必須舍棄其他的小姐姐。

下面來張實際點的圖搞清楚他的原理。

9ace0279c955cd4b1f070ade5df7ffe.png

基于上述圖片,我們知道,對于 LRU 的操作,無非在于插入 (insert), 刪除 (delete),以及替換,針對替換來說,如果緩存空間滿了,那么就是 insert to head and delete for tail。如果未滿,也分為兩種,一種是緩存命中的話,只需要把緩存的值 move to head。如果之前不存在,那么就是 insert to head。

實現(xiàn)過程

接下來就是數(shù)據(jù)結(jié)構(gòu)的選擇了。數(shù)組的存儲是連續(xù)的內(nèi)存空間,雖然查詢的時間復(fù)雜度是 O (1), 但是刪除和插入為了保存內(nèi)存空間的連續(xù)性,需要進(jìn)行搬移,那么時間復(fù)雜度就是 O (n), 為了實現(xiàn)能快速刪除,故而采用雙向鏈表。但是鏈表的查詢時間復(fù)雜度是 O (n), 那么就需要 hash table。屁話說了這么多,代碼實現(xiàn)。其實之前刷過這道題目。特地拿出來講一下。

class LRUCache {
 private $capacity;
 private $list;
 /**
 * @param Integer $capacity
 */
 function __construct($capacity) {
 $this->capacity=$capacity;
 $this->list=new HashList();
 }
 /**
 * @param Integer $key
 * @return Integer
 */
 function get($key) {
 if($key<0) return -1;
 return $this->list->get($key);
 }
 /**
 * @param Integer $key
 * @param Integer $value
 * @return NULL
 */
 function put($key, $value) {
 $size=$this->list->size;
 $isHas=$this->list->checkIndex($key);
 if($isHas || $size+1 > $this->capacity){
 $this->list->removeNode($key);
 }
 $this->list->addAsHead($key,$value);
 }
}
class HashList{
 public $head;
 public $tail;
 public $size;
 public $buckets=[];
 public function __construct(Node $head=null,Node $tail=null){
 $this->head=$head;
 $this->tail=$tail;
 $this->size=0;
 }
 //檢查鍵是否存在
 public function checkIndex($key){
 $res=$this->buckets[$key];
 if($res){
 return true;
 }
 return false;
 }
 public function get($key){
 $res=$this->buckets[$key];
 if(!$res) return -1;
 $this->moveToHead($res);
 return $res->val;
 }
 //新加入的節(jié)點
 public function addAsHead($key,$val)
{
 $node=new Node($val);
 if($this->tail==null && $this->head !=null){
 $this->tail=$this->head;
 $this->tail->next=null;
 $this->tail->pre=$node;
 }
 $node->pre=null;
 $node->next=$this->head;
 $this->head->pre=$node;
 $this->head=$node;
 $node->key=$key;
 $this->buckets[$key]=$node;
 $this->size++;
 }
 //移除指針(已存在的鍵值對或者刪除最近最少使用原則)
 public function removeNode($key)
{
 $current=$this->head;
 for($i=1;$i<$this->size;$i++){
 if($current->key==$key) break;
 $current=$current->next;
 }
 unset($this->buckets[$current->key]);
 //調(diào)整指針
 if($current->pre==null){
 $current->next->pre=null;
 $this->head=$current->next;
 }else if($current->next ==null){
 $current->pre->next=null;
 $current=$current->pre;
 $this->tail=$current;
 }else{
 $current->pre->next=$current->next;
 $current->next->pre=$current->pre;
 $current=null;
 }
 $this->size--;
 }
 //把對應(yīng)的節(jié)點應(yīng)到鏈表頭部(最近get或者剛剛put進(jìn)去的node節(jié)點)
 public function moveToHead(Node $node)
{
 if($node==$this->head) return ;
 //調(diào)整前后指針指向
 $node->pre->next=$node->next;
 $node->next->pre=$node->pre;
 $node->next=$this->head;
 $this->head->pre=$node;
 $this->head=$node;
 $node->pre=null;
 }
}
class Node{
 public $key;
 public $val;
 public $next;
 public $pre;
 public function __construct($val)
{
 $this->val=$val;
 }
}
/**
 * Your LRUCache object will be instantiated and called as such:
 * $obj = LRUCache($capacity);
 * $ret_1 = $obj->get($key);
 * $obj->put($key, $value);

Github 整理地址:https://github.com/wuqinqiang/leetcode-php

更多PHP知識,請訪問PHP中文網(wǎng)!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

使用PHP實現(xiàn)LRU緩存淘汰算法

使用PHP實現(xiàn)LRU緩存淘汰算法:LRU(cache)LRU 介紹緩存是一種提高數(shù)據(jù)讀取性能的技術(shù)。但是對于計算機來說,并不可能緩存所有的數(shù)據(jù),在達(dá)到它的臨界空間時,我們需要通過一些規(guī)則用新的數(shù)據(jù)取代掉一部分的緩存數(shù)據(jù)。這時候你會如果選擇替換呢?替換的策略有很多種,常用的有以下幾種:●
推薦度:
標(biāo)簽: 使用 緩存 php
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top