静态变量数组实现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);//数组重置
    }
    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/>";
}
?>

效果如下:

结果如下:

正是我们想要的!

时间: 2024-10-16 07:44:22

静态变量数组实现LRU算法的相关文章

【练习】试图通过mprotect保护一个静态变量

试图使用mprotect保护一个静态变量数组,当对该静态变量受保护的部分写时,程序core dump #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <unistd.h> int protect_bss(void * p, size_t len) {     size_t page_size = sysconf(_SC_PAGE_SIZE);     if(page_

CI源码引用使用--php引用demo,静态变量和引用关系

CI源码引用使用在Common.php中,加载配置和类的方法 function &test() {     static $a = '';     if (!$a) {         $a = 2;     }     return $a; } $test =& test(); echo $test; $test = 3; echo test();   结果是23 引用:方法和使用方法的变量指向同一块内容:修改使用后的变量,方法内部值也会变 注意:方法和使用都需要&   静态变量

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }

4. 数组和排序算法1

1. 数组的定义 一组相关变量的集合 一个数组实际上就是一连串的变量 数组中的变量必须是相同的数据类型 数组可以分为一维数组.二维数组和多维数组 例如:numbers[100]来代替直接声明100个独立变量number0,number1,....,number99 2. 一维数组 2.1 数组的声明 两种声明方式: 数据类型[] 数组名 //首选 数据类型 数组名[] //效果相同,C语言的格式,不推荐 举例: int[] myList //推荐 int myList[] //不推荐 2.2 数

static、静态变量、静态方法

1 静态:static 1.1 用法 是一个修饰符:用于修饰成员(成员变量和成员函数) 1.2 好处 当成员变量被静态static修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用格式:类名.静态成员,也就变成了类变量 2 静态的特点 2.1 随着类的加载而加载,也就是,说静态会随着类的消失而消失,说明静态的生命周期最长 2.2 优先于对象的存在 明确一点:静态是先存在的对象是后存在的 2.3 被所有对象共享 2.4 可以直接用 类名. 调用 3 实例变量和类变量的区别 3.

java学习(四)static静态变量 和this

java中的this /* this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 注意:谁调用这个方法,在该方法内部的this就代表谁. this的场景: 解决局部变量隐藏成员变量 */ //定义学生类 class Student { //姓名 private String name; //年龄 private int age; //姓名获取值 public String getName() { return name; } //姓名设置值 public void setName(

java 静态变量生命周期(类生命周期)

Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放内存空间.static变量的生命周期取决于类的生命周期 类初始化顺序: 静态变量.静态代码块初始化 构造函数 自定义构造函数 结论:想要用static存一个变量,使得下次程序运行时还能使用上次的值是不可行的.因为静态变量生命周期虽然长(就是类的生命周期),但是当程序执行完,也就是该类的所有对象都已经

C++局部变量、全局变量、静态变量(堆、栈、静态存储区)

1 static关键字 1.1 隐藏 eg: //a.c文件中 char a = 'A'; void msg() { printf("Hello\n"); } //main.c文件中 extern char a; printf("%c",a); 输出结果:A Hello 所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问.a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的. 如果加了stat

LinkedHashMap 和 LRU算法实现

个人觉得LinkedHashMap 存在的意义就是为了实现 LRU 算法. public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> { public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.