Leecode LRU缓存机制

Leecode 146. LRU缓存机制

https://leetcode-cn.com/problems/lru-cache/

利用php array的有序性

class LRUCache {
    private $capacity;
    private $map = []; 
    /**
     * @param Integer $capacity
     */
    function __construct($capacity) {
        $this->capacity = $capacity;
    }
  
    /**
     * @param Integer $key
     * @return Integer
     */
    function get($key) {
        $val = -1;
        $key = __CLASS__.$key;
        if ( array_key_exists($key, $this->map) ) {
            $val = $this->map[$key];
            unset($this->map[$key]);
            $this->map[$key] = $val;
        }


        return $val;
    }
  
    /**
     * @param Integer $key
     * @param Integer $value
     * @return NULL
     */
    function put($key, $value) {
        $key = __CLASS__.$key;
        if ( array_key_exists($key, $this->map) ) {
            unset($this->map[$key]);
        }
        if ( count($this->map) >= $this->capacity) {
            array_shift($this->map);
        }
        $this->map[$key] = $value;
    }
}


/**
 * Your LRUCache object will be instantiated and called as such:
 * $obj = LRUCache($capacity);
 * $ret_1 = $obj->get($key);
 * $obj->put($key, $value);
 */

利用双链表

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


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


class CacheQueue {
    public $size = 0;
    public $head;
    public $tail;


    function __construct() {
        $this->head = new DLNode(0, 0);
        $this->tail = new DLNode(0, 0);
        $this->head->next = $this->tail;
        $this->tail->prev = $this->head;
    }


    //头插法
    function addHead($node) {
        //node指向之前的第一个节点
        $node->next = $this->head->next;
        $node->next->prev = $node;
        $node->prev = $this->head;
        $this->head->next = $node;
        $this->size++;
    }


    //删除访问的节点,且把该节点移动到头部
    function moveToHead($node) {
        $node->prev->next = $node->next;
        $node->next->prev = $node->prev;
        $this->size--;
        $this->addHead($node);
    }


    //删除末尾元素,且返回删除节点
    function removeTail() {
        $node = NULL;
        if ($this->size > 0) {
            $node = $this->tail->prev;
            $node->prev->next = $this->tail;
            $this->tail->prev = $node->prev;
            $this->size--;
        }


        return $node;
    }


    function flushall() {
        while ($node = $this->removeTail()) {
            unset($node);
        }
    }
}


class LRUCache {
    public $cache; // 双向链表
    public $capacity; //存放限定最大空间
    public $map; //存放hashmap
    /**
     * @param Integer $capacity
     */
    function __construct($capacity) {
        $this->capacity = $capacity;
        $this->cache = new CacheQueue();
        $this->map = [];
    }
  
    /**
     * @param Integer $key
     * @return Integer
     */
    function get($key) {
        $res = -1; //初始化
        if ( array_key_exists($key, $this->map) ) {
            $res = $this->map[$key]->value; //获取返回值
            $this->cache->moveToHead($this->map[$key]); //将此节点移动到队首
        }
        
        return $res;
    }
  
    /**
     * @param Integer $key
     * @param Integer $value
     * @return NULL
     */
    function put($key, $value) {
        if ( array_key_exists($key, $this->map) ) {
            $node = & $this->map[$key];
            $node->value = $value;
            $this->cache->moveToHead($node);
        } else {
            if ($this->capacity === $this->cache->size) {
                $node = $this->cache->removeTail();
                unset($this->map[$node->key]);
            }


            $node = new DLNode($key, $value);
            $this->map[$key] = $node;
            $this->cache->addHead($node);
        }
    }


    function flushall() {
        $this->cache->flushall();
        $this->map = [];
    }
}


/**
 * Your LRUCache object will be instantiated and called as such:
 * $obj = LRUCache($capacity);
 * $ret_1 = $obj->get($key);
 * $obj->put($key, $value);
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值