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) { //先判斷是否需要?jiǎng)h除 $this->shiftNode(); $this->addNode($key,$value); return true; } //自動(dòng)刪除 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ù)組(對(duì)象)
結(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)文章
phpstorm斷點(diǎn)調(diào)試方法圖文詳解
這篇文章主要介紹了phpstorm斷點(diǎn)調(diào)試方法,結(jié)合圖文形式詳細(xì)分析了phpstorm斷點(diǎn)調(diào)試的基本配置方法、使用技巧與注意事項(xiàng),需要的朋友可以參考下2023-04-04php中curl和file_get_content的區(qū)別
抓取遠(yuǎn)程內(nèi)容,之前一直都在用file_get_content函數(shù),其實(shí)早就知道有curl這么一個(gè)好東西的存在,但是看了一眼后感覺使用頗有些復(fù)雜,沒有file_get_content那么簡單,再就是需求也不大,所以沒有學(xué)習(xí)使用curl2014-05-05php源碼分析之DZX1.5字符串截?cái)嗪瘮?shù)cutstr用法
這篇文章主要介紹了php源碼分析之DZX1.5字符串截?cái)嗪瘮?shù)cutstr用法,實(shí)例分析了DZX1.5中cutstr函數(shù)實(shí)現(xiàn)字符串截取的使用技巧,需要的朋友可以參考下2015-06-06PHP的偽隨機(jī)數(shù)與真隨機(jī)數(shù)詳解
這篇文章主要介紹了PHP的偽隨機(jī)數(shù)與真隨機(jī)數(shù)詳解,本文首先講解了真隨機(jī)數(shù)和偽隨機(jī)數(shù)的相關(guān)概念,并給出了比用mt_rand()函數(shù)產(chǎn)生更好的偽隨機(jī)數(shù)的一段例子代碼,需要的朋友可以參考下2015-05-05PHP簡單實(shí)現(xiàn)斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)斷點(diǎn)續(xù)傳下載的方法,涉及php針對(duì)文件傳輸?shù)南嚓P(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09解決dede生成靜態(tài)頁和動(dòng)態(tài)頁轉(zhuǎn)換的一些問題,及火車采集入庫生成動(dòng)態(tài)的辦法
解決dede生成靜態(tài)頁和動(dòng)態(tài)頁轉(zhuǎn)換的一些問題,及火車采集入庫生成動(dòng)態(tài)的辦法...2007-03-03php實(shí)現(xiàn)將HTML頁面轉(zhuǎn)換成word并且保存的方法
這篇文章主要介紹了php實(shí)現(xiàn)將HTML頁面轉(zhuǎn)換成word并且保存的方法,結(jié)合實(shí)例形式分析了PHPWord工具的功能與使用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10