使用 Mermaid 语法绘制的 LRU 算法核心原理图解:
graph LR
subgraph 双向链表结构
direction LR
head[头节点] <--> A[节点A] <--> B[节点B] <--> C[节点C] <--> tail[尾节点]
style head fill:#f9f,stroke:#333
style tail fill:#f96,stroke:#333
style C fill:#fcc
end
subgraph 哈希表
key1 --> A
key2 --> B
key3 --> C
end
note[最久未访问的节点在尾部] --> C
note2[每次访问将节点移动到头部] --> head
LRU 核心操作图解
1. 访问节点B
graph LR
subgraph 访问后链表变化
direction LR
head[头节点] <--> B[节点B] <--> A[节点A] <--> C[节点C] <--> tail[尾节点]
style B fill:#ccf
style C fill:#fcc
end
note[访问节点B时: 1. 断开B前后连接 2. 将B插入头部] --> B
2. 插入新节点D(缓存已满)
graph LR
subgraph 插入后链表变化
direction LR
head[头节点] <--> D[新节点D] <--> B[节点B] <--> A[节点A] <--> tail[尾节点]
style D fill:#cfc
style A fill:#fcc
C[被淘汰的节点C] -.->|从链表和哈希表删除| C
end
关键原理说明
-
双向链表
- 头部存放最近访问的节点,尾部存放最久未访问的节点。
- 每次访问(查询或插入)节点时,将其移动到链表头部。
-
哈希表
- 快速定位节点在链表中的位置(时间复杂度 O(1))。
-
淘汰策略
- 当缓存满时,直接删除链表尾部节点,并在哈希表中移除对应键。
通过上述结构,LRU 算法实现了 O(1) 时间复杂度的访问和插入操作,同时确保最久未使用的数据被优先淘汰。