LRU 算法,但 get 和 put 必须 O(1),用哈希表

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

题目有key、value的,直接就上map了
结果:
LRU 算法,但 get 和 put 必须 O(1),用哈希表_第1张图片
仔细一看,原来要 get 和 put 必须 O(1)

只能抛弃树型数据结构了

线性的数据结构也可以吧,如果可以构造出一个队列,从前往后放入;如果访问,把访问的那个拿出来放后面;如果满了,把最前面的那个踢出去;如果更新,把更新的那个放最后面

  1. 从前往后放入:queue
  2. 如果访问,把访问的那个拿出来放后面:放后面queue能实现,但是找到那个访问的,暴力O(n),如果是用map就是O(logn),没到O(1)
  3. 如果满了,把最前面的那个踢出去:queue
  4. 如果更新,把更新的那个放最后面:跟2一样,问题在找不着

能在O(1)找到元素的数据结构是哈希表
哈希表是unordered_map

我自己写这题的时候负优化,想着可以在队列中存一些脏数据,等到用到的时候再判断这个数据脏不脏。但其实,这个判断也是要时间的,不如直接维护真实数据


看到题解有人用list,list的话是链式结构,插入O(1),删除O(1),查询O(n),刚开始我想,删除不用找到对应的那个么?这样又O(n)了?其实是不用的,如果是自己实现的话

    void removeNode(DLinkedNode* node) {
        node->prev->next = node->next;
        node->next->prev = node->prev;
    }

这个node是一个指针,这个指针是unordered_map给的,而不是迭代list找到的,那就O(1)

你可能感兴趣的:(算法,算法,散列表,数据结构)