静态变量数组实现LRU算法

it2022-07-04  106

LRU算法的解释详情请见 https://baike.baidu.com/item/LRU/1269842

这里百度百科给出的比较详细,然后后面有一个例子 说

LRU(least recently used)最近最少使用。 假设 序列为 4 3 4 2 3 1 4 2 物理块有3个 则 首轮 4调入内存 4 次轮 3调入内存 3 4 之后 4调入内存 4 3 之后 2调入内存 2 4 3 之后 3调入内存 3 2 4 之后 1调入内存 1 3 2(因为最少使用的是4,所以丢弃4) 之后 4调入内存 4 1 3(原理同上) 最后 2调入内存 2 4 1 又如: 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6 1 1 2 2 1 3 3 2 1 4 4 3 2 1 2 2 4 3 1 1 1 2 4 3 5 5 1 2 4 6 6 5 1 2 2 2 6 5 1 1 1 2 6 5 2 2 1 6 5 3 3 2 1 6 7 7 3 2 1 6 6 7 3 2 3 3 6 7 2 2 2 3 6 7 1 1 2 3 6 2 2 1 3 6 3 3 2 1 6 6 6 3 2 1 那么想达到这样的效果 用PHP如何实现呢? 我给出核心函数如下 <?php function lru($into_data="") { static $array=array(); $max_length=5;//最大长度 if(empty($array)) { $array[]=$into_data; }else { //说明不为空 不为空则进行查找 $find_index=array_search($into_data, $array); if($find_index!==false) { //说明找到了 找到的话就放到第一个来 unset($array[$find_index]);//去掉这个 拿到第一个去 array_unshift($array,$into_data);//放到第一个去 }else { //没找到 判断是否达到最大长度 如果达到 去掉最后一个 if(count($array)==$max_length-1) { //到达最大长度 // 去除最后一个 array_pop($array); array_unshift($array,$into_data);//放到第一个去 }else { array_unshift($array,$into_data);//放到第一个去 } } //$array=array_values($array);//数组重置 经superfat提醒这里不用重置 可以注释 } return $array; } ?>

调用代码如下:

<?php $array=array(1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6); foreach ($array as $key => $v) { $now=lru($v); echo ($v)." ".(implode(" ",$now))."<br/>"; } ?>

效果如下:

结果如下:

正是我们想要的!

 

转载于:https://www.cnblogs.com/lizhaoyao/p/7473210.html


最新回复(0)