1.单链表实现LRU(O(n))
单向链表,从head出,tail进入(理解成队列,左进(tail)右出(head)。
* 查找:
1.查找:遍历得到这个数据对应的结点
2.移动:将其从原来的位置删除,然后再插入到链表的尾部
* 添加:查找 + (移动/删除)
- 缓存中已存在:移动到队尾
- 缓存中不存在:
- 缓存未满,则将此结点直接插入到链表的尾部
- 缓存已满,则链表**头结点删除**,将新的数据结点插入链表的尾部
* 删除:
1.查找:遍历找到要删除节点
2.删除:用前驱节点删除
这三个操作都要涉及“查找”操作。所以,如果单纯地采用链表的话,时间复杂度只能是 O(n)。
// 直接继承Java的LinkedList,就不用再自己实现链表
public class LinkedLRU extends LinkedList {
private int capcity;
public LinkedLRU (int capcity) {
this.capcity = capcity;
}
@Override
public boolean add(String str) {
// 如果队列中包含要添加元素
if (contains(str)) {
// 删除,然后再插入到队尾
remove(str);
// 如果队列中不包含要添加元素
} else {
// 如果队列已经满乐,就将元素队首删除
if (size() == capcity) {
removeFirst();
}

文章介绍了如何使用Java实现LRU缓存策略。首先通过单链表实现,但查找、添加和删除操作的时间复杂度为O(n)。然后改进为散列表结合双向链表的方式,利用散列表的快速查找特性,将所有操作优化到O(1)复杂度。文章还提供了具体的代码实现,包括LinkedHashMap的使用。
最低0.47元/天 解锁文章
169

被折叠的 条评论
为什么被折叠?



