当前位置:首页 > 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) 冒泡排序通过多次遍历数组,…

js实现基数算法

js实现基数算法

基数排序(Radix Sort)简介 基数排序是一种非比较型整数排序算法,通过逐位分配和收集实现排序。适用于整数或固定格式字符串,时间复杂度为O(nk),其中n是元素数量,k是数字位数。 实…

蚁群算法js实现

蚁群算法js实现

蚁群算法简介 蚁群算法(Ant Colony Optimization, ACO)是一种模拟蚂蚁觅食行为的启发式算法,常用于解决组合优化问题(如旅行商问题TSP)。蚂蚁通过信息素(pheromone)…

用js来实现所有算法

用js来实现所有算法

在 JavaScript 中实现所有算法是一个庞大的任务,因为算法种类繁多,涵盖数据结构、排序、搜索、图论、动态规划等多个领域。以下是部分常见算法的 JavaScript 实现示例,供参考: 排序…

用JS实现快速排序算法

用JS实现快速排序算法

快速排序的原理 快速排序是一种分治算法,通过选择一个基准元素(pivot)将数组分为两部分,一部分小于基准,另一部分大于基准,然后递归地对这两部分进行排序。 代码实现 function quick…

js实现24点算法

js实现24点算法

24点算法简介 24点游戏的目标是通过加、减、乘、除四则运算,将4个数字组合成结果为24的表达式。以下是基于JavaScript的实现方法。 基本思路 排列组合:生成所有可能的数字排列顺序。 运算符…