码迷,mamicode.com
首页 > 编程语言 > 详细

静态变量数组实现LRU算法

时间:2017-09-04 15:00:17      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:arc   最大   val   col   详细   color   max   比较   func   

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);//数组重置
    }
    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/>";
}
?>

效果如下:

技术分享

结果如下:

技术分享

正是我们想要的!

 

静态变量数组实现LRU算法

标签:arc   最大   val   col   详细   color   max   比较   func   

原文地址:http://www.cnblogs.com/lizhaoyao/p/7473210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!