中山网络公司网站,做网站公司大连,房地产网站设计公司,佛山建设小学网站文章目录 LRUCache LRUCache
1. LRUCache是一种缓存的替换技术#xff0c;在CPU和main memory之间根据计算机的局部性原理#xff0c;往往会采用SRAM技术来构建CPU和主存之间的高速缓存#xff0c;DRAM(dynamic random access memory)用于构建主存#xff0c;LRUCache这种… 文章目录 LRUCache LRUCache
1. LRUCache是一种缓存的替换技术在CPU和main memory之间根据计算机的局部性原理往往会采用SRAM技术来构建CPU和主存之间的高速缓存DRAM(dynamic random access memory)用于构建主存LRUCache这种缓存替换技术常被应用于高速缓存中缓存行的替换我们接下来就要模拟实现LRUCache这种数据结构。
LRU 缓存
2. LRUCache主要实现两个接口一个是get一个是put实现get和put有人可能会想到用一个哈希表因为哈希表查找和插入数据的时间复杂度刚好是O(1)这当然没问题但是你如何实现LRU呢 我们如何每次在数据满了之后删除的数据是最近没有访问的数据呢这该怎么保证实际上要保证LRU方式数据的删除和更新使用一个链表是最合适不过的了如果我们访问了某一个数据那就把这个数据从链表中的某一位置移动到链表头去这样的话每次最近访问的数据都会在链表的头部而长时间不访问的数据就会在链表尾部放着那么当数据结构中数据满了的时候我们只要将链表尾部的数据删除即可然后将新到来的数据重新插入到数据结构中这样就可以实现LRU了。 但是现在还有一个问题我们是将数据存储到链表当中了但是当涉及到更新操作时如何快速找到特定的pair结点将他的value值更改呢如果遍历链表来更新的话那么这个操作就不是O(1)了而是O(N)所以如何找到特定结点成为了破局的关键我们让哈希表存储的pair对中的value值为链表的迭代器这样一来就完美设计出一个高效的LRUCache结构了。 在查找某一结点时我们直接用哈希表就可以实现O(1)的快速查找只要能够查找到结点那么get操作put时可能的更新操作这些就都是O(1)时间复杂度了。 在实现代码时如果我们访问了某个结点那么就要把这个结点转移到链表头部转移的操作可以使用erasepush_front但这样会涉及到迭代器失效的问题因为哈希表中存储的迭代器指向原来的结点结点被你erase了那么迭代器就会失效我们还需要自己重新更改哈希表中存储的迭代器这样有点麻烦同时删除结点其实会遍历链表这样的操作也不是很高效那么这时候STL还给我们提供了一个接口splice意为拼接可以将某一位置的迭代器指向的结点拼接到链表中的任意位置拼接的原理其实就是通过更改指针的指向来完成结点的转移这样就可以不用释放结点和重新申请结点的操作了效率就会高一些。 3. 某些面试官为了测试我们的能力并不想让我们使用STL自带的list而是想要让我们手搓一个链表来完成这题则我们可以自己实现一个双向循环链表为了使得头插尾删操作的便捷性与传统的带头双向循环链表不同的是我们可以伪造两个哨兵卫结点一前一后分别是dummyHead和dummyTail这样在实现尾删接口时我们不用再去找尾同时在头插时也不用考虑结点作头的情况直接在dummyHead后面插入即可所以说两个哨兵卫结点是真的香啊