靜態變量數組實現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/>";
}
?>

效果如下:

結果如下:

正是我們想要的!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM