这个基于双向链表+Map表
2大特点:
- 保持顺序,即访问顺序FIFO。保持顺序的只有顺序类型如链表、数组
- 快速查找,给定的KEY,能够快速查找的有:二叉搜索树、Hash表、跳表SkipList
再细化各特点
《1》链表特点是:插入、删除、移动都是O(1)操作,随机访问O(N)
《2》数组特点是:插入、删除、移动都是O(N),只有当都是头、尾元素时,才是O(1)。 随机访问O(1)。
而Cache不需要随机访问第K个元素,而需要频繁的移动、删除。因此,需要用链表。为了便于插入,使用双双向链表,又为了实际代码中便于书写各函数,改成带头结点的双向循环链表,这样的好处是不用考虑在队头、队尾。插入,删除等特殊情况。
快速查找,方便使用,因此选用标准的map表,也可以使用hash表,甚至自行设计的hash表,而且,性能应该更好些。
带头节点的循环双向链表,为自行设计,和标准的list操作很多一样。可作为基本素材。
在实际设计过程中,有些小细节,可用于提高性能。
《1》改用链表的删除为断开连接,这样减少 new 和delete操作
《2》这主要是用于重复访问上一次的(这个在实际的cache中会经常遇到,即刚刚访问的,下次继续访问,但在leetcode中,加入该句,性能反而更低)
if(cachePriority.begin()!=p)
{
cachePriority.clean_link(p);
cachePriority.link_after(cachePriority.get_head(),p);
}
#pragma once
#include
#include
#include
#include
在贴一个,设计原理没有变。但仅适用于leetcode的。accept为80ms
(1)用unordered_map代替红黑树的map,如果结合特点,自行设计的hash表应该更快。
(2)去掉 模板,将模板类的双向链表改成普通的。
实际性能提高20%。
#pragma once
#include