当前位置:首页 > PHP

lru算法PHP实现

2026-02-15 08:28:32PHP

LRU算法简介

LRU(Least Recently Used)是一种缓存淘汰策略,优先淘汰最近最少使用的数据。PHP中可通过数组或结合链表实现,以下是两种常见实现方式。

基于数组的简易实现

利用PHP数组的键值对和unset特性,手动维护访问顺序:

lru算法PHP实现

class LRUCache {
    private $capacity;
    private $cache = [];

    public function __construct($capacity) {
        $this->capacity = $capacity;
    }

    public function get($key) {
        if (!isset($this->cache[$key])) {
            return -1;
        }
        $value = $this->cache[$key];
        unset($this->cache[$key]); // 删除原有键
        $this->cache[$key] = $value; // 重新插入到末尾(表示最新使用)
        return $value;
    }

    public function put($key, $value) {
        if (isset($this->cache[$key])) {
            unset($this->cache[$key]);
        } elseif (count($this->cache) >= $this->capacity) {
            array_shift($this->cache); // 移除最旧的元素
        }
        $this->cache[$key] = $value;
    }
}

说明

lru算法PHP实现

  • get操作将访问的键移动到数组末尾,模拟“最近使用”。
  • put操作在容量满时移除数组开头的元素(最久未使用)。

基于链表+哈希表的高效实现

使用双向链表(SplDoublyLinkedList)和哈希表(SplObjectStorage)优化时间复杂度:

class LRUCache {
    private $capacity;
    private $list;
    private $map;

    public function __construct($capacity) {
        $this->capacity = $capacity;
        $this->list = new SplDoublyLinkedList();
        $this->map = new SplObjectStorage();
    }

    public function get($key) {
        if (!isset($this->map[$key])) {
            return -1;
        }
        $node = $this->map[$key];
        $this->list->push($this->list->offsetGet($node)); // 移动到链表尾部
        $this->list->offsetUnset($node);
        return $node->value;
    }

    public function put($key, $value) {
        if (isset($this->map[$key])) {
            $this->list->offsetUnset($this->map[$key]);
        } elseif ($this->list->count() >= $this->capacity) {
            $oldest = $this->list->shift();
            unset($this->map[$oldest->key]);
        }
        $node = (object)['key' => $key, 'value' => $value];
        $this->list->push($node);
        $this->map[$key] = $this->list->count() - 1;
    }
}

优化点

  • 链表操作的时间复杂度为O(1),适合高频读写场景。
  • SplObjectStorage用于快速定位链表节点。

注意事项

  • 数组实现简单但效率较低,适合小规模数据。
  • 链表实现需注意PHP的SplDoublyLinkedList索引更新逻辑。
  • 实际生产环境建议使用成熟的缓存库(如Redis)内置的LRU功能。

标签: 算法lru
分享给朋友:

相关文章

php实现算法

php实现算法

PHP 实现常见算法的方法 PHP 可以实现多种算法,包括排序、搜索、递归、动态规划等。以下是几种常见算法的 PHP 实现方式。 冒泡排序(Bubble Sort) 冒泡排序通过多次遍历数组,每…

php实现欧几里得算法实现

php实现欧几里得算法实现

欧几里得算法简介 欧几里得算法(辗转相除法)用于计算两个非负整数的最大公约数(GCD)。其核心思想是通过反复用较小数除较大数取余,直到余数为0,此时的除数即为最大公约数。 PHP实现方法 以下是用P…

js回文算法实现

js回文算法实现

回文算法的实现方法 方法一:使用字符串反转 将字符串反转后与原字符串比较,若相同则为回文。 function isPalindrome(str) { const reversedStr…

排序算法 php实现

排序算法 php实现

以下是在PHP中实现常见排序算法的几种方法,每种算法均附上代码示例和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置完成排序,时间复杂度为O(n²)。 function bubbleSort(…

php 实现排序算法

php 实现排序算法

冒泡排序 冒泡排序通过多次遍历数组,每次比较相邻元素并交换位置,将较大元素逐步移至数组末尾。 function bubbleSort($array) { $n = count($arra…

php实现lru

php实现lru

LRU缓存实现原理 LRU(Least Recently Used)缓存淘汰算法会优先移除最久未被使用的数据。PHP实现通常需要结合哈希表和双向链表,哈希表保证O(1)的查询速度,双向链表维护访问顺序…