当前位置: 首页 > wzjs >正文

一个网站建设10万元福田做网站哪家专业

一个网站建设10万元,福田做网站哪家专业,网络营销是做什么工作,辽宁省建设工程信息网开标说明LRU (最近最少使用) 文章目录 LRU (最近最少使用)一、LRU是什么?二、实现1.常规算法2.双栈更替总结 一、LRU是什么? LRU(Least Recently Used)是一种常见的缓存淘汰策略,核心思想是 “淘汰最长时间未被使用的缓存数据…

LRU (最近最少使用)


文章目录

  • LRU (最近最少使用)
  • 一、LRU是什么?
  • 二、实现
    • 1.常规算法
    • 2.双栈更替
    • 总结


一、LRU是什么?

LRU(Least Recently Used)是一种常见的缓存淘汰策略,核心思想是 “淘汰最长时间未被使用的缓存数据”。它通过追踪数据的访问历史,确保频繁使用的内容保留在缓存中,从而最大化缓存的命中率。

二、实现

1.常规算法

代码如下(示例):

import java.util.HashMap;
import java.util.Map;
// 双向链表节点
class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode() {}public DLinkedNode(int key, int value) {this.key = key;this.value = value;}
}
public class LRUCache {private Map<Integer, DLinkedNode> cache;private int capacity;private int size;private DLinkedNode head; private DLinkedNode tail;public LRUCache(int capacity) {this.capacity = capacity;this.size = 0;this.cache = new HashMap<>();// 初始化双向链表head = new DLinkedNode();tail = new DLinkedNode();head.next = tail;tail.prev = head;}// 获取缓存值public int get(int key) {DLinkedNode node = cache.get(key);if (node == null) {return -1;}// 访问后移至链表头部moveToHead(node);return node.value;}// 添加/更新缓存public void put(int key, int value) {DLinkedNode node = cache.get(key);if (node == null) {// 新增节点DLinkedNode newNode = new DLinkedNode(key, value);cache.put(key, newNode);addToHead(newNode);size++;// 检查容量if (size > capacity) {DLinkedNode removed = removeTail();cache.remove(removed.key);size--;}} else {// 更新节点值并移至头部node.value = value;moveToHead(node);}}// 将节点添加到链表头部private void addToHead(DLinkedNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}// 从链表中移除节点private void removeNode(DLinkedNode node) {node.prev.next = node.next;node.next.prev = node.prev;}private void moveToHead(DLinkedNode node) {removeNode(node);addToHead(node);}private DLinkedNode removeTail() {DLinkedNode removed = tail.prev;removeNode(removed);return removed;}
}

2.双栈更替

利用栈的先进后出的特点,假设元素1,2,3依此放入栈中,那么1就在栈底,3就在栈顶,那么元素处于的位置越高,元素就越“新”,这个顺序模拟的是我们取用元素的最新时间,而不是该元素的过期(淘汰)的时间,就像在生活中,我们频繁用到的东西往往会放在明面上,而好久都用不到的东西就会放在很深的角落。

那么对于一个单向栈,我们该如何限制总元素数量以及进行元素淘汰呢,因为需要淘汰的元素都在栈底,所以引入第二个栈B,在淘汰时,将栈A元素依次取出,并依次加入栈B,这时原栈A的栈底元素变成了栈B的栈顶元素,这时依据栈的大小就可以直接进行淘汰了。

代码如下(示例):

import java.util.Stack;class LRUCache {private Stack<Integer> stackKey;private Stack<Integer> stackValue;private int capacity;public LRUCache(int capacity) {this.stackKey = new Stack<>();this.stackValue = new Stack<>();this.capacity = capacity;}public int get(int key) {// 先查找key是否存在int index = stackKey.search(key);if (index == -1) {return -1;} else {// 为了移动元素到栈顶,需要先弹出上面的元素Stack<Integer> tempKey = new Stack<>();Stack<Integer> tempValue = new Stack<>();// 将目标元素上面的元素暂存到临时栈for (int i = 0; i < index - 1; i++) {tempKey.push(stackKey.pop());tempValue.push(stackValue.pop());}// 获取目标元素int targetKey = stackKey.pop();int targetValue = stackValue.pop();// 先将临时栈的元素放回原栈while (!tempKey.isEmpty()) {stackKey.push(tempKey.pop());stackValue.push(tempValue.pop());}// 再将目标元素压入栈顶stackKey.push(targetKey);stackValue.push(targetValue);return targetValue;}}public void put(int key, int value) {// 先检查key是否已存在int index = stackKey.search(key);if (index == -1) {// key不存在,直接添加到栈顶stackKey.push(key);stackValue.push(value);// 检查是否超过容量if (stackKey.size() > capacity) {// 移除栈底元素(最久未使用)// 为了移除栈底元素,需要先弹出所有元素Stack<Integer> tempKey = new Stack<>();Stack<Integer> tempValue = new Stack<>();// 将所有元素移到临时栈while (!stackKey.isEmpty()) {tempKey.push(stackKey.pop());tempValue.push(stackValue.pop());}// 移除临时栈的栈底元素(原栈的栈底)tempKey.pop();tempValue.pop();// 将剩余元素放回原栈while (!tempKey.isEmpty()) {stackKey.push(tempKey.pop());stackValue.push(tempValue.pop());}}} else {// key已存在,需要更新值并移到栈顶// 先将目标元素上面的元素暂存到临时栈Stack<Integer> tempKey = new Stack<>();Stack<Integer> tempValue = new Stack<>();for (int i = 0; i < index - 1; i++) {tempKey.push(stackKey.pop());tempValue.push(stackValue.pop());}// 移除目标元素stackKey.pop();int oldValue = stackValue.pop();// 先将临时栈的元素放回原栈while (!tempKey.isEmpty()) {stackKey.push(tempKey.pop());stackValue.push(tempValue.pop());}// 将新值添加到栈顶stackKey.push(key);stackValue.push(value);}}
}

总结

双栈的优点在于不需要使用复杂的数据结构就可以实现,并且在双栈更替的过程可以根据需求进行自定义淘汰标准,在追求低时间复杂度时可以考虑双向链表和哈希表的组合。

双栈的扩展==》多栈,双栈最大的问题在于,在进行淘汰时,每次都需要双栈元素交替,导致需要抛出所有元素,那么采用多栈是否可以优化这一点呢,我们可以依据实际需要来控制单个栈的大小,当元素过多时则新建栈来进行存储,而双栈交替则变成多栈依次交替,而需要淘汰最早的元素时,仅需要拿到栈号,然后简单交替即可,同时,当过期时间引入成为元素的存储依据时,也可以依据建栈时的栈号,来定位元素位置,而更替本身也只需交换栈号即可。



文章转载自:

http://dKxe2EUt.hkysq.cn
http://dRqMncgo.hkysq.cn
http://55eEXazt.hkysq.cn
http://NlDHfDwB.hkysq.cn
http://3TNPyCRD.hkysq.cn
http://4DqSJJq1.hkysq.cn
http://DyPZHFeL.hkysq.cn
http://Nusouh4t.hkysq.cn
http://40quHgkz.hkysq.cn
http://BJBNdXNg.hkysq.cn
http://5YoYVrJq.hkysq.cn
http://t7UbB1wg.hkysq.cn
http://3qNFcNxT.hkysq.cn
http://QRCCyJQE.hkysq.cn
http://DnW2iKCf.hkysq.cn
http://MqVdwwmu.hkysq.cn
http://XshplFkF.hkysq.cn
http://4G8LNdjQ.hkysq.cn
http://i8SFnhDH.hkysq.cn
http://2BZVnPO4.hkysq.cn
http://dUPtRKxX.hkysq.cn
http://jlgqSr4S.hkysq.cn
http://2svjiSjs.hkysq.cn
http://5caBpqOw.hkysq.cn
http://XLFgjwnQ.hkysq.cn
http://tIZZncOL.hkysq.cn
http://gUX8LIPJ.hkysq.cn
http://xgJECFU4.hkysq.cn
http://TrtDvKRk.hkysq.cn
http://l2zwgZsb.hkysq.cn
http://www.dtcms.com/wzjs/776183.html

相关文章:

  • ps怎么做电商网站国内html5网站欣赏
  • 南宁江南区网站制作价格网站建设推广方案书
  • 网站修改idstore wordpress
  • 广东建设厅证件查询网站如何寻找客户
  • 网站建设书籍推荐辽宁省建设工程招投标
  • 建设网站的公司要什么资质吗安顺网站设计
  • 重庆网站建设求职简历做网站用什么开发好
  • 临沂网站制作价格网站功能与内容设计的步骤
  • dw php网站建设视频教程上海网站公司
  • 东阿网站建设电话网站管理后台密码忘记了
  • 做网站各个流程重庆有哪些公司
  • 岳池网站建设网站建设设计服务
  • 中国网站建设调查分析开鲁seo服务
  • 免费网页制作网站wordpress用户等级
  • 山东省建设项目监理协会网站wordpress resume
  • 佛山网站seo公司网页设计尺寸单位一般为
  • 门户网站建设策划学校风采网站建设需求
  • php做电影网站秦皇岛市属于哪个省份
  • 团购网站案例怎么做才能让网站快速收录
  • 网站建设中英语企业网站建设需要做些什么
  • vr看房网站开发费用wordpress评论ajax加载
  • 怎么做自己的门户网站专门做折扣的网站有哪些
  • 做地方网站要办什么证陕西省建设网页企业信息
  • 国内著名网站建设公司s001网站建设设计
  • 湖南省金力电力建设有限公司 网站wordpress响应式模板
  • ztjs登录网络推广的优化方法
  • v2ex 网站建设自己做的网站为何手机不能浏览
  • 做面包的公司网站电子软件开发工资多少钱
  • 和布克赛尔网站建设大学国际化网站建设
  • 小学校园网站建设要求装饰装修公司排名前十强