• 静态变量数组实现LRU算法


    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/>";
    }
    ?>

    效果如下:

    结果如下:

    正是我们想要的!

  • 相关阅读:
    MSSQLSERVER服务无法启动的解决方案
    引用类型和原始类型的对比(java)
    MVC中关于Membership类跟数据库的问题
    ASP.NET协作应用集成到trsids身份验证服务器的开发流程
    oracle的一知半解
    辨明你所从事的软件的类型
    sql数据库之间数据的转录
    设为首页 收藏(IE可用)
    如何缩减Try{}Catch{}Finally{}代码----定义一个公用的Try{}Catch{}Finally{}
    如何判断字符串是否存在数字
  • 原文地址:https://www.cnblogs.com/lizhaoyao/p/7473210.html
Copyright © 2020-2023  润新知