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

宁波做简单网站的职业培训学校

宁波做简单网站的,职业培训学校,网络营销都有哪些,java做网站电话注册LRU: LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。 核心思想: 基于Map实现k-v存储,双向链表中使用一个虚拟头部和虚拟尾部,虚拟头部的…

LRU:

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。

核心思想:

基于Map实现k-v存储,双向链表中使用一个虚拟头部和虚拟尾部,虚拟头部的下一个结点是链表第一个结点,虚拟尾部的前一个结点是链表最后一个结点。每次查询、新增、修改某个Key时,将key在链表中的位置移动到头部,这样尾部结点就是最近最少使用的,每次容量超限时从尾部删除。get缓存和put缓存操作的时间复杂度都为O(1)

链表结点结构:

class Node{int key;int value;Node next;Node prev;public Node(){next=null;prev=null;}public Node(int key,int value){this.key=key;this.value=value;next=null;prev=null;}}

代码:

假设缓存的kv都为int类型

public class LRUCache {class Node{int key;int value;Node next;Node prev;public Node(){next=null;prev=null;}public Node(int key,int value){this.key=key;this.value=value;next=null;prev=null;}}private int capacity;private HashMap<Integer,Node> cache=new HashMap<>();private Node head,tail;public LRUCache(int capacity) {this.capacity=capacity;head=new Node();tail=new Node();head.next=tail;tail.prev=head;}public int get(int key) {Node node= cache.get(key);if(node==null)return -1;//删除key在链表中的noderemoveNode(node);//将key在链表中的node放到队头addToHead(node);return node.value;}public void put(int key, int value) {Node node =cache.get(key);if(node!=null){//更新valuenode.value=value;//删除key在链表中的noderemoveNode(node);//将key在链表中的node放到队头addToHead(node);}else{Node newNode=new Node(key,value);cache.put(key,newNode);//将key在链表中的node放到队头addToHead(newNode);if(cache.size()>capacity){//容量超过capacityNode remo =tail.prev;cache.remove(remo.key);removeNode(remo);}}}private void removeNode(Node node){node.prev.next=node.next;node.next.prev=node.prev;}private void addToHead(Node node){node.next=head.next;node.prev=head;head.next.prev=node;head.next=node;}public static void main(String[] args) {LRUCache lRUCache = new LRUCache(2);lRUCache.put(1, 1); // 缓存是 {1=1}lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}System.out.println(lRUCache.get(1));    // 返回 1lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}System.out.println(lRUCache.get(2));    // 返回 -1 (未找到)lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}System.out.println(lRUCache.get(1));    // 返回 -1 (未找到)System.out.println(lRUCache.get(3));    // 返回 3System.out.println(lRUCache.get(4));    // 返回 4}
}

 运行结果:

注:

为什么用双向链表而不是单向链表?

在删除链表操作中,单链表要找到要删除结点的前驱结点时间复杂度就为O(n)了,而用双链表可以在O(1)复杂度上删除结点。

为什么链表节点需要同时存储 key 和 value,而不是仅仅只存储 value

(容量超限)删除缓存时,要根据node的key从Map中找到node,从而将缓存删除。

http://www.hrbkazy.com/news/8664.html

相关文章:

  • wordpress设置内容标题天津seo管理平台
  • 新网站应该怎么做可以排名靠前成都百度推广
  • 局域网建网站的详细步骤李勇seo的博客
  • wordpress 地址转换优化百度百科
  • 网站301跳转怎么做的个人网页免费域名注册入口
  • 电影购买网站怎么设计黑帽seo优化软件
  • 网站从哪些方面做优化友情链接买卖代理
  • 深圳企业网站制作百度极速版推广
  • wordpress 显示纯文字网站关键词排名优化工具
  • 成功的营销网站最新国内你新闻
  • 上海专业高端网站建设服务器seo网站有优化培训班吗
  • 开家网站建设培训百度排名优化专家
  • 罗湖网站建设报价拓客app下载
  • 做农业种子的网站网络培训心得
  • 如何做网页游戏seo官网优化
  • 新图闻的品牌建设经验seo是谁
  • 线下推广渠道有哪些网站seo的内容是什么
  • 嘉祥县建设局网站简阳seo排名优化培训
  • 网站设计 济南seo研究学院
  • 企业网站是如何做的淘宝指数查询官网手机版
  • 网站下载系统网站建设方案范文
  • 清远公司网站建设营销软文范例大全
  • 资阳公司网站建设引流app推广软件
  • 做网站需要懂哪些语言分销平台
  • 自己的电脑做服务器 并建网站网站制作软件
  • 网站建设布局利于优化百度云盘搜索
  • 网站速度优化 js加载同城推广平台
  • 上海环球金融中心造价珠海seo推广
  • 用网站模板建站网络热词2021
  • 在国外做盗版网站吗百度seo引流