PHP實(shí)現(xiàn)LRU算法的原理詳解
1.概念
LRU : 最近最少使用算法
2.代碼
<?php
class Node
{
public $preKey = null; //鏈表前一個(gè)節(jié)點(diǎn)
public $nextKey = null; //鏈表后一個(gè)節(jié)點(diǎn)
public $key= null; //當(dāng)前的值
public $value= null; //當(dāng)前key
public function __construct($key,$value){
$this->key = $key;
$this->value = $value;
}
public function setPre($preKey)
{
$this->preKey = $preKey;
}
public function setNext($nextKey)
{
$this->nextKey = $nextKey;
}
}
class LRUCache{
public $cacheTable = [];
/** Node null */
private $headNode = null;
private $lastNode = null;
private $cacheCount = 0;
private $cacheMax = 3;
public function addNode($key,$value) //此處采用頭插法
{
$addNode = new Node($key,$value);
if ( !empty($this->headNode))
{
$this->headNode->preKey = $addNode; //如果鏈表存在,將節(jié)點(diǎn)添加到節(jié)點(diǎn)前一個(gè)
}
$addNode->nextKey = $this->headNode;
//第一次保存最后一個(gè)節(jié)點(diǎn)為頭結(jié)點(diǎn)
if ($this->lastNode == null){
$this->lastNode = $addNode;
}
$this->headNode = $addNode;
$this->cacheTable[$key] = $addNode;
$this->cacheCount++;
}
public function set($key,$value)
{
//先判斷是否需要刪除
$this->shiftNode();
$this->addNode($key,$value);
return true;
}
//自動刪除
public function shiftNode()
{
while ($this->cacheCount >= $this->cacheMax){
if (!empty($this->lastNode)){
if ($this->lastNode->preKey){
$this->lastNode->preKey->nextKey = null;
$this->lastNode = $this->lastNode->preKey;
}
unset($this->cacheTable[$this->lastNode->key]);
}
$this->cacheCount --;
}
}
public function dumpAllData()
{
$node = $this->headNode;
while (($node)){
echo "key=".$node->key."value=".$node->value."\n";
$node = $node->nextKey;
}
}
}
$Cache = new LRUCache();
$Cache->set("a","aaaaaaaaaaa");
$Cache->set("b","bbbbbbbbbbb");
$Cache->set("c","ccccccccccc");
$Cache->set("d","dddddddddddd");
$Cache->set("e","eeeeeeeeeeee");
//$Cache->set("f","ffffffffffff");
$Cache->dumpAllData();
//var_dump($Cache); //是一個(gè)深度的數(shù)組(對象)
結(jié)果
[root@VM-16-13-centos ~]# php LRU.php
key=evalue=eeeeeeeeeeee
key=dvalue=dddddddddddd
key=cvalue=ccccccccccc
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
深思 PHP 數(shù)組遍歷的差異(array_diff 的實(shí)現(xiàn))
深思 PHP 數(shù)組遍歷的差異(array_diff 的實(shí)現(xiàn))...2006-06-06
php中cURL?error?60:SSL?certificate?problem:?unable?to?
PHP中cURL錯(cuò)誤60通常表示SSL證書問題,即無法獲取本地頒發(fā)機(jī)構(gòu)證書,這通常是由于cURL無法驗(yàn)證遠(yuǎn)程服務(wù)器的SSL證書導(dǎo)致的,本給大家介紹了如何解決php中cURL?error?60,需要的朋友可以參考下2023-12-12
PHP基于MySQL數(shù)據(jù)庫實(shí)現(xiàn)對象持久層的方法
這篇文章主要介紹了PHP基于MySQL數(shù)據(jù)庫實(shí)現(xiàn)對象持久層的方法,實(shí)例分析了php實(shí)現(xiàn)持久層的相關(guān)技巧,需要的朋友可以參考下2015-06-06
PHP 開發(fā)環(huán)境配置(Zend Server安裝)
運(yùn)行安裝文件(ZendServer-CE-php-5.3.2-5.0.1-Windows_x86.exe)開始安裝,選項(xiàng)請參照我的選擇。2010-04-04
php中switch與ifelse的效率區(qū)別及適用情況分析
這篇文章主要介紹了php中switch與ifelse的效率區(qū)別及適用情況分析,以實(shí)例的形式分析了針對變量與常量的情況下switch與ifelse的效率區(qū)別,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之一 重新組織你的函數(shù)
我把我比較喜歡的和比較關(guān)注的地方寫下來和大家分享。上次我寫了篇《php 跟老大的對話》。還是有很多疑問,這書幫了我不少的忙2012-04-04
PHP 實(shí)現(xiàn)頁面靜態(tài)化的幾種方法
這篇文章主要介紹了PHP 實(shí)現(xiàn)頁面靜態(tài)化的幾種方法,需要的朋友可以參考下2017-07-07

