当前位置:首页 > 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
分享给朋友:

相关文章

lru php实现

lru php实现

PHP实现LRU缓存算法 LRU(Least Recently Used)是一种常用的缓存淘汰策略,核心思想是当缓存空间不足时优先移除最久未使用的数据。以下是两种PHP实现方式: 使用双向链表+哈希…

蚁群算法js实现

蚁群算法js实现

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

用js来实现所有算法

用js来实现所有算法

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

js实现冒泡算法

js实现冒泡算法

冒泡排序算法实现 冒泡排序是一种简单的排序算法,通过重复遍历数组,比较相邻元素并交换顺序错误的元素,直到整个数组有序。 基本实现 function bubbleSort(arr) { l…

js实现火焰算法

js实现火焰算法

火焰算法实现基础 火焰算法(Fire Effect)是一种模拟火焰燃烧效果的图形算法,常用于生成动态火焰视觉效果。在JavaScript中,可以通过Canvas或WebGL实现。 使用Canvas实…

php 实现共识算法

php 实现共识算法

共识算法简介 共识算法是分布式系统中确保多个节点对某一数据或状态达成一致的机制。常见的共识算法包括Paxos、Raft、PBFT(实用拜占庭容错)等。PHP作为一种后端语言,可以实现这些算法的简化版本…