当前位置:首页 > PHP

lru算法PHP实现

2026-03-13 07:31:20PHP

LRU算法的基本概念

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

PHP实现LRU算法的关键步骤

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

lru算法PHP实现

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
分享给朋友:

相关文章

php实现算法

php实现算法

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

php 实现算法

php 实现算法

PHP 实现常见算法的方法 PHP 作为一门服务器端脚本语言,可以实现多种算法。以下是一些常见算法的 PHP 实现示例。 排序算法 冒泡排序 function bubbleSort($array)…

js实现基数算法

js实现基数算法

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

蚁群算法js实现

蚁群算法js实现

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

用js来实现所有算法

用js来实现所有算法

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

js锚点定位算法实现

js锚点定位算法实现

实现锚点定位的基本方法 使用Element.scrollIntoView()方法是最简单的实现方式。该方法将滚动页面使指定元素出现在视口中。 document.getElementById('tar…