LRU算法实现

Posted 果然朝辉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LRU算法实现相关的知识,希望对你有一定的参考价值。

LRU是Last Recent Used 缩写,做为一种缓存算法,将最近较少使用的缓存失效。memcache采用了该算法。如下采用了一种php的实现方式。该算法将每次新增的内容,放到缓存顶部,达到缓存极限时,将缓存底部的内容清除。可以通过如下PHP代码来模拟。

<?php
class LRUCache {

    private $head;

    private $tail;

    private $capacity;

    private $hashmap;

    public function __construct($capacity) {
        $this->capacity = $capacity;
        $this->hashmap = array();
        $this->head = new Node(null, null);
        $this->tail = new Node(null, null);

        $this->head->setNext($this->tail);
        $this->tail->setPrevious($this->head);
    }

    public function get($key) {

        if (!isset($this->hashmap[$key])) { return null; }

        $node = $this->hashmap[$key];
        if (count($this->hashmap) == 1) { return $node->getData(); }

        // refresh the access
        $this->detach($node);
        $this->attach($this->head, $node);

        return $node->getData();
    }

    public function put($key, $data) {
        if ($this->capacity <= 0) { return false; }
        if (isset($this->hashmap[$key]) && !empty($this->hashmap[$key])) {
            $node = $this->hashmap[$key];
            // update data
            $this->detach($node);
            $this->attach($this->head, $node);
            $node->setData($data);
        }
        else {
            $node = new Node($key, $data);
            $this->hashmap[$key] = $node;
            $this->attach($this->head, $node);

            // check if cache is full
            if (count($this->hashmap) > $this->capacity) {
                // we‘re full, remove the tail
                $nodeToRemove = $this->tail->getPrevious();
                $this->detach($nodeToRemove);
                unset($this->hashmap[$nodeToRemove->getKey()]);
            }
        }
        return true;
    }

    private function attach($head, $node) {
        $node->setPrevious($head);
        $node->setNext($head->getNext());
        $node->getNext()->setPrevious($node);
        $node->getPrevious()->setNext($node);
    }

    private function detach($node) {
        $node->getPrevious()->setNext($node->getNext());
        $node->getNext()->setPrevious($node->getPrevious());
    }

}

/**
 * Class that represents a node in a doubly linked list
 */
class Node {

    private $key;

    // the content of the node
    private $data;

    // the next node
    private $next;

    // the previous node
    private $previous;

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

    public function setData($data) {
        $this->data = $data;
    }

    public function setNext($next) {
        $this->next = $next;
    }

    public function setPrevious($previous) {
        $this->previous = $previous;
    }

    public function getKey() {
        return $this->key;
    }

    public function getData() {
        return $this->data;
    }

    public function getNext() {
        return $this->next;
    }

    public function getPrevious() {
        return $this->previous;
    }

}





以上是关于LRU算法实现的主要内容,如果未能解决你的问题,请参考以下文章

LRU算法实现

LRU算法的实现

LinkedHashMap实现LRU算法

LRU(最近最少使用淘汰算法)基本实现

Java实现一个LRU算法

带你学会 LRU 算法相关内容