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

制作网站需要域名还需要什么如何自己做购物网站

制作网站需要域名还需要什么,如何自己做购物网站,企业网站建设的重要性和必要性,本地的响应式网站建设题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记…

题目

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

实现 LRUCache 类:

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例

输入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

提示:
1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 105
最多调用 2 * 105 次 get 和 put

思路

LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。

  • 双向链表:最近使用的发到链表头,按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
  • 哈希表:为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。作用:快速定位节点,和链表保持数据一致性,确保淘汰过程正确,控制容量

get和put操作流程

get流程:

  1. 判断key是否存在,不存在则返回-1
  2. key存在,难到这个key的节点Node,并将当前这个Node移动到链表的头部
  3. 返回Node结点的value

put流程:

  1. 判断key是否存在哈希表中,不存在,则使用key和calue创建应该新的节点Node,并将这个Node添加到链表的头部,再判断链表中的节点数是否超过容量,超出则删除链表尾部节点Node 和 哈希表中对应的项
  2. 如果key存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。

通过分析上面的流程分析,我们需要定义几个数据结构和方法

  • 节点Node的定义:使用双向链表
    • 优点:快速移动到头节点,快速删除尾部节点,维护访问顺序
    • 代码:
      class DLinkedNode {int key;int value;// 前节点DLinkedNode prev;// 后节点DLinkedNode next;// 无参构造public DLinkedNode() {}// 构造public DLinkedNode(int _key, int _value) {key = _key; value = _value;}
      }
      
  • 删除节点:
    private void removeNode(DLinkedNode node) {node.prev.next = node.next;node.next.prev = node.prev;
    }
    
  • 删除尾节点:
private DLinkedNode removeTail() {DLinkedNode res = tail.prev;removeNode(res);return res;
}
  • 新增节点:在头部添加
    private void addToHead(DLinkedNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;
    }
  • Node移动到头部的操作:removeToHead
    private void moveToHead(DLinkedNode node) {removeNode(node);addToHead(node);
    }
    
  • LRUCache参数:初始化容量、实时容量、map缓存、头尾节点
    private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
    // 实时记录缓存元素数量:跟踪当前缓存中的数据量,用于容量控制
    private int size;
    // 容量阈值:定义缓存最大承载量
    private int capacity;
    // head:表操作锚点:作为双向链表的固定起始点,简化头部插入操作
    // tail:LRU节点标识:标记链表末端,便于快速定位待淘汰节点
    private DLinkedNode head, tail;
    
  • 初始化zhegLRUCache
    public LRUCache(int capacity) {this.size = 0;this.capacity = capacity;// 使用伪头部和伪尾部节点head = new DLinkedNode();tail = new DLinkedNode();head.next = tail;tail.prev = head;
    }
    
  • get操作
    public int get(int key) {DLinkedNode node = cache.get(key);if (node == null) {return -1;}// 如果 key 存在,先通过哈希表定位,再移到头部moveToHead(node);return node.value;
    }
    
  • put 操作
    public void put(int key, int value) {DLinkedNode node = cache.get(key);if (node == null) {// 如果 key 不存在,创建一个新的节点DLinkedNode newNode = new DLinkedNode(key, value);// 添加进哈希表cache.put(key, newNode);// 添加至双向链表的头部addToHead(newNode);++size;if (size > capacity) {// 如果超出容量,删除双向链表的尾部节点DLinkedNode tail = removeTail();// 删除哈希表中对应的项cache.remove(tail.key);--size;}}else {// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部node.value = value;moveToHead(node);}
    }
    

算法

public class LRUCache {class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode() {}public DLinkedNode(int _key, int _value) {key = _key; value = _value;}}private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();private int size;private int capacity;private DLinkedNode head, tail;public LRUCache(int capacity) {this.size = 0;this.capacity = capacity;// 使用伪头部和伪尾部节点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;}// 如果 key 存在,先通过哈希表定位,再移到头部moveToHead(node);return node.value;}public void put(int key, int value) {DLinkedNode node = cache.get(key);if (node == null) {// 如果 key 不存在,创建一个新的节点DLinkedNode newNode = new DLinkedNode(key, value);// 添加进哈希表cache.put(key, newNode);// 添加至双向链表的头部addToHead(newNode);++size;if (size > capacity) {// 如果超出容量,删除双向链表的尾部节点DLinkedNode tail = removeTail();// 删除哈希表中对应的项cache.remove(tail.key);--size;}}else {// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部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 res = tail.prev;removeNode(res);return res;}
}

但是在日常工作中,还是直接使用LinkedHashMap便可以了

  • 插入模式(默认): 新节点追加至链表尾部

    示例插入顺序 A → B → C → D

  • 访问模式

    • accessOrder=true:访问/插入节点均移至尾部,LRU缓存淘汰策略
      • (accessOrder=true): 被访问节点移至链表尾部

        访问B后的顺序 A → C → D → B

    • 默认值:新节点始终追加尾部,保留原始插入顺序
class LRUCache extends LinkedHashMap<Integer, Integer>{private int capacity;public LRUCache(int capacity) {// accessOrder=truesuper(capacity, 0.75F, true);this.capacity = capacity;}public int get(int key) {return super.getOrDefault(key, -1);}public void put(int key, int value) {super.put(key, value);}@Overrideprotected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {// 触发淘汰最久未使用项return size() > capacity; }
}

文章转载自:

http://cTInWixx.khxwp.cn
http://BFOGEGUE.khxwp.cn
http://MI4NjJ1j.khxwp.cn
http://3bUZCgwV.khxwp.cn
http://Ol3uKVM1.khxwp.cn
http://ui8L3Ckq.khxwp.cn
http://qtGKFsVi.khxwp.cn
http://uqY568PM.khxwp.cn
http://jnhc2IYB.khxwp.cn
http://ZMvRTJUr.khxwp.cn
http://jpy7BpIl.khxwp.cn
http://HlL45lLa.khxwp.cn
http://AZ2LYGvt.khxwp.cn
http://jSvrifl7.khxwp.cn
http://qPfl5JbB.khxwp.cn
http://KSXst94e.khxwp.cn
http://hLQMTDua.khxwp.cn
http://YLBZx3Dq.khxwp.cn
http://Z8Oa8wKG.khxwp.cn
http://idlQhnFo.khxwp.cn
http://Kjqqk5Ql.khxwp.cn
http://Lyc7zStw.khxwp.cn
http://7byiHJYn.khxwp.cn
http://AWHbRBk2.khxwp.cn
http://EE2kPAYB.khxwp.cn
http://7PXitZg5.khxwp.cn
http://SGirVByA.khxwp.cn
http://3ICWdIZp.khxwp.cn
http://xZh5jTS6.khxwp.cn
http://GATOVo1K.khxwp.cn
http://www.dtcms.com/wzjs/706582.html

相关文章:

  • 中华企业网站建设新华书店的做的数字阅读网站
  • ios认证 东莞网站建设百度关键词竞价价格
  • 线上调研问卷在哪个网站上做网易企业邮箱手机端登录不上咋办
  • 网站放假通知大型门户网站建设多少钱
  • 用dw做的网页如何上传到网站wordpress 视频采集
  • 做企业网站服务wordpress中英文建站
  • 大城县企业网站建设crm系统排行
  • 网站的电子地图怎么做一个app下载网站
  • 企业门户网站建设方案书西部数码网站助手4.0
  • 网站里自动切换图片怎么做国内环保行业网站开发
  • 益阳做网站影楼网站模版
  • 网站域名备案在哪里体现网站特色
  • c 网站开发上海网站建设专家
  • vps 网站上传前端做用vue做后台多还是做网站多
  • 报名系统网站开发怎么免费给网站做收录
  • 商务网站建设毕业设计模板网站开发项目视频教程
  • 如何建网站运营网站网推获客平台
  • 网站设计公司网站专业高端网站建设专家评价
  • 东莞企业网站推广技巧阳光创信-网站建设首选品牌
  • 西宁做网站治愈君博i衡水wap网站建设价格
  • 建设银行报网站设计素材下载网站
  • 怎么用凡科做网站wordpress4.7.10漏洞
  • 大连市网站推广公司优秀网站案列
  • 网站收录低的原因设计图制作软件app手机
  • 网站工程工资一般多少钱数据分析培训课程
  • 网站内页如何做排名深圳光明网站建设
  • 兰州建设网站汉中建设工程招投标信息网
  • 初中生如何做网站wordpress插件删除失败
  • 网站模板下载好之后如何安装wordpress keywords description
  • 网站做404好处流量套餐网站