当前位置:首页 > PHP

lru算法PHP实现

2026-03-13 07:31:20PHP

lru算法PHP实现

LRU算法的基本概念

LRU(Least Recently Used)算法是一种常用的缓存淘汰策略,其核心思想是淘汰最近最少使用的数据。当缓存空间不足时,优先移除最久未被访问的数据。

lru算法PHP实现

PHP实现LRU算法的关键步骤

使用哈希表和双向链表结合的方式可以实现高效的LRU算法。哈希表用于快速查找键值,双向链表用于维护访问顺序。

class LRUCache {
    private $capacity;
    private $map = [];
    private $head;
    private $tail;

    public function __construct($capacity) {
        $this->capacity = $capacity;
        $this->head = new Node(null, null);
        $this->tail = new Node(null, null);
        $this->head->next = $this->tail;
        $this->tail->prev = $this->head;
    }

    public function get($key) {
        if (!isset($this->map[$key])) {
            return -1;
        }
        $node = $this->map[$key];
        $this->removeNode($node);
        $this->addToFront($node);
        return $node->value;
    }

    public function put($key, $value) {
        if (isset($this->map[$key])) {
            $node = $this->map[$key];
            $node->value = $value;
            $this->removeNode($node);
            $this->addToFront($node);
        } else {
            if (count($this->map) >= $this->capacity) {
                $lastNode = $this->tail->prev;
                unset($this->map[$lastNode->key]);
                $this->removeNode($lastNode);
            }
            $newNode = new Node($key, $value);
            $this->map[$key] = $newNode;
            $this->addToFront($newNode);
        }
    }

    private function removeNode($node) {
        $prev = $node->prev;
        $next = $node->next;
        $prev->next = $next;
        $next->prev = $prev;
    }

    private function addToFront($node) {
        $node->prev = $this->head;
        $node->next = $this->head->next;
        $this->head->next->prev = $node;
        $this->head->next = $node;
    }
}

class Node {
    public $key;
    public $value;
    public $prev;
    public $next;

    public function __construct($key, $value) {
        $this->key = $key;
        $this->value = $value;
    }
}

实现细节说明

  • Node类:表示双向链表的节点,包含键、值、前驱和后继指针。
  • LRUCache类:包含哈希表($map)和双向链表($head$tail)。
  • get方法:获取键对应的值,并将节点移到链表头部表示最近使用。
  • put方法:插入或更新键值对,如果超过容量则移除链表尾部节点。
  • removeNode和addToFront:维护双向链表的操作,确保O(1)时间复杂度。

使用示例

$cache = new LRUCache(2);
$cache->put(1, 1);
$cache->put(2, 2);
echo $cache->get(1); // 返回 1
$cache->put(3, 3);   // 移除键 2
echo $cache->get(2); // 返回 -1

性能分析

  • 时间复杂度getput操作均为O(1)。
  • 空间复杂度:O(n),n为缓存容量。

这种实现方式高效且易于理解,适合大多数PHP应用场景。

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

相关文章

react diff算法实现

react diff算法实现

React Diff 算法实现原理 React 的 Diff 算法(Reconciliation)是虚拟 DOM(Virtual DOM)更新的核心机制,通过高效比较新旧虚拟 DOM 树的差异,最小化…

php实现算法

php实现算法

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

用js来实现所有算法

用js来实现所有算法

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

用JS实现快速排序算法

用JS实现快速排序算法

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

js 签名算法实现

js 签名算法实现

签名算法概述 签名算法通常用于确保数据的完整性和真实性,常见于API请求、数据传输等场景。JavaScript中可以通过多种方式实现签名算法,如HMAC、RSA等。 HMAC签名实现 HMA…

js实现火焰算法

js实现火焰算法

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