范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

简单实现LRUCache

  前几天,录了一个实现LRUCache的视频,但是并没有说明为什么是这样设计的,所以本文将分享一下设计的思路。LRU的基本概念:
  LRU是Least Recently Used的缩写,最近最少使用算法。 LRU的查询、添加、删除、修改的时间复杂度O(1):
  使用哈希表快速定位到对应的节点上,然后通过简单的指针变换进行元素的增删改查LRU的Java实现:哈希表 + 双向链表
  1、定义双向链表Node节点class Node {         int key;         int value;         Node prev;         Node next;          public Node() {         }          public Node(int key, int value) {             this.key = key;             this.value = value;         }          @Override         public String toString() {             return "Node{" +                     "key=" + key +                     ", value=" + value +                     "}";         }     }
  2、定义LRUCache的相关属性//当前LRUCache的数量 private int size; //LRUCache的容量 private int capacity; //双向链表的头结点 private Node head; //双向链表的尾结点 private Node tail; //哈希表 key: key, value: 双向链表的节点 private Map cache = new HashMap<>();
  3、初始化LRUCache public LRUCache(int capacity) {         this.capacity = capacity;         this.size = 0;         this.head = new Node();         this.tail = new Node();         this.head.next = tail;         this.tail.prev = head;     }
  4、定义几个常用的方法
  删除节点:private void removeNode(Node node) {     node.next.prev = node.prev;     node.prev.next = node.next; }
  将节点添加到头结点:private void addToHead(Node node) {     node.next = head.next;     head.next.prev = node;     node.prev = head;     head.next = node; }
  将节点移动到头结点:private void moveToHead(Node node) {     removeNode(node);     addToHead(node); }
  5、定义LRUCache的添加、修改和查询
  查询:public int get(int key) {     Node node = cache.get(key);     if (node == null) {         return -1;     }     moveToHead(node);     return node.value; }
  添加和修改:public void put(int key, int value) {     Node node = cache.get(key);     if (node == null) {         Node newNode = new Node(key, value);         cache.put(key, newNode);         addToHead(newNode);         size++;         if (size > capacity) {             removeNode(tail.prev);             size--;         }     } else {         node.value = value;         moveToHead(node);     } }
  6、打印LRUCachepublic void print() {     System.out.println("-------------------------------------------------------------------------");     Node cur = head.next;     while (cur.next != null) {         System.out.println("prev: " + cur.prev + ", cur: " + cur + ", next: " + cur.next);         cur = cur.next;     } }
  7、测试public static void main(String[] args) {     LRUCache cache = new LRUCache(5);     cache.put(1, 10);     cache.put(2, 20);     cache.put(3, 30);     cache.put(4, 40);     cache.put(5, 50);     cache.put(6, 60);     cache.print();     System.out.println(cache.get(4));     cache.print();     cache.put(6, 999);     cache.print(); }
  8、结果------------------------------------------------------------------------- prev: Node{key=0, value=0}, cur: Node{key=6, value=60}, next: Node{key=5, value=50} prev: Node{key=6, value=60}, cur: Node{key=5, value=50}, next: Node{key=4, value=40} prev: Node{key=5, value=50}, cur: Node{key=4, value=40}, next: Node{key=3, value=30} prev: Node{key=4, value=40}, cur: Node{key=3, value=30}, next: Node{key=2, value=20} prev: Node{key=3, value=30}, cur: Node{key=2, value=20}, next: Node{key=0, value=0} 40 ------------------------------------------------------------------------- prev: Node{key=0, value=0}, cur: Node{key=4, value=40}, next: Node{key=6, value=60} prev: Node{key=4, value=40}, cur: Node{key=6, value=60}, next: Node{key=5, value=50} prev: Node{key=6, value=60}, cur: Node{key=5, value=50}, next: Node{key=3, value=30} prev: Node{key=5, value=50}, cur: Node{key=3, value=30}, next: Node{key=2, value=20} prev: Node{key=3, value=30}, cur: Node{key=2, value=20}, next: Node{key=0, value=0} ------------------------------------------------------------------------- prev: Node{key=0, value=0}, cur: Node{key=6, value=999}, next: Node{key=4, value=40} prev: Node{key=6, value=999}, cur: Node{key=4, value=40}, next: Node{key=5, value=50} prev: Node{key=4, value=40}, cur: Node{key=5, value=50}, next: Node{key=3, value=30} prev: Node{key=5, value=50}, cur: Node{key=3, value=30}, next: Node{key=2, value=20} prev: Node{key=3, value=30}, cur: Node{key=2, value=20}, next: Node{key=0, value=0}
  如果有什么问题,或者有什么错误,欢迎评论区提出,谢谢各位大大

公司装机究竟怎么选路由器?(本文开始前,首先声明是穷鬼向,有钱人左转网络公司)路由器是网络的核心,对于企业来说也是重中之重。传统企业多采用企业级路由器配合acap模式,达到自己的使用需求。但是这套配置轻则大2021不谈信仰的路由器推荐路由器是家庭网络的核心,一个家网络上的爽不爽一个好的路由器十分关键。今天不谈信仰,只谈体验。说说我在2021年推荐的800元以内的路由器。在此强调,以下推荐路由器含有部分魔改路由,vivoampampquot最惨ampampquot5G手机,44W快冲,降价一千多无人问津在当今的手机市场中,4G手机正在悄然退出市场,而5G手机已成为主要制造商推出的流行机型。在短短的一年内,市场上的5G手机层出不穷,vivo首次发布了该型号。5G手机已被遗忘,而正是郭世英之死重估郭沫若郭世英的中学时代是在北京有名的干部子弟学校101中度过的。在中学里他一直是班上的三好学生,模范共青团员,还被誉为高干子女的表率。那时,郭世英不仅成绩优秀,还是一个体育爱好者,是学校网站SEO优化做好能抵销售?杭州石炭纪用网站来干了销售的活在数字化时代该怎么做生意?首先你得有切实的产品,接着你需要搭建好自己的宣传矩阵,然后就需要做好营销推广,把自己的名头打响出去,让更多客户知道你,最后才是收获客户线索,达成生意。这其这样就能把新客户变成回头客?你的官网是否支持会员注册呢?客户对于一个企业来说就是运转下去的动力,所以如何获客成为了所有老板们最关心的事情,但仅仅是获得新客户就够了吗?当然不是,企业要做的绝对不仅仅是开拓新用户,想办法留住老客户,让客户愿如何用好在线表单功能获客?在使用在线表单时还遇到过哪些问题?在线表单这一功能在如今的各种类型网站中都很常见,有时候点开一家企业的官网,就能够直接在网站首页填写表单,注册网站会员。就算网站首页没有设置表单,往下翻一翻,往往也能够在网页底部看到为啥不推荐使用黑帽SEO?其实用LTD也能快速做好SEO优化想要让自己的网站被更多用户浏览,自然就需要提升网站在搜索引擎中的排名,这一过程被称为SEO优化。现如今绝大多数企业的网站都会进行SEO优化,但效果却各不相同。有些官网的排名上升速度营销物料多次上传太麻烦?没事,我们可以批量解决前不久有用户向我们反映我们现在要做一个新网站,可原来网站上的文章内容要一篇一篇手动上传到后台,真的太费时间了!的确,我们可以想象这么一个场景当你搭建好了自己的新官网,看着空荡荡的内使用官微中心文章编辑器时碰上了这几个问题?别担心工欲善其事,必先利其器。企业想要做好数字化营销,一个强大的企业官网后台是必不可少的。而其中,企业官网后台具备的营销物料的上传和分享功能则是会直接影响到企业官网数字化营销的结果。因此等等党的福利!这几款机型非常合适,网友不会再错过了RedmiK30至尊纪念版价格为2000元价位的产品,首先想到的肯定是刚刚发布的RedmiK30至尊纪念版,这部手机应该是这个价格下无脑购买的代表。总而言之一句话,放心大胆的购买就
格林美报废动力电池里寻金的破烂王2020年,中国新能源车卖了136万辆,和整个欧洲基本平起平坐。其中,销量最大的两个品牌,一个是著名的特斯拉,另一个是人民的五菱。和2500万辆汽车总销量相比,新能源车的占比已经超Android新版本,全新界面设计,实用功能都有哪些?在的GoogleIO大会上,Google公布了很多关于Android12的特点,其中较为吸引人的就是全新的MaterialYou设计语言。国内众多厂商也开始布局,发布了Androi强悍性能加持!iQOONeo5活力版成618购机首选近期有多个手机厂商发布了旗下的新款产品,其中iQOONeo5活力版在上线后得到了大量年轻网友的喜爱。它采用了诸多旗舰级的硬件配置,具备强悍的性能以及出色的影音表现。不仅如此,这款手国产机拼命吆喝,没赚几个钱,iPhone12以12出货量,拿下34收入过去的一年多以来,几乎所有的厂商都在冲击高端,因为华为手机的下滑,给了国产厂商们千载难逢的机会。所以我们看到,小米OV们纷纷走向了高端之路,价格纷纷上涨,因为冲击高端,除了能多赚钱上海新能源销量暴增,但插混却意外翻车去年10月底,上海发布交通管理部门发布新规自2020年11月2日开始,上海内环高架上外牌限行时间加长2021年五一假期之后,内环地面道路也将对外牌限时开放。于是,在新政发布后的半年新开普牵手联通支付,将加快数字人民币业务布局大河财立方消息据新开普公众号发布,近日,新开普与联通支付有限公司(以下简称联通支付)签订战略协议,在国密产品数字人民币产品和解决方案5GSIM卡移动安全业务等领域建立战略合作关系,天猫618今晚开买88VIP用户买手机都是全网最低价今晚0点,天猫618正式开买!剁手党们今天只用做三件事去淘宝领消费券添加购物车付尾款。据了解,今年618期间,天猫将给消费者发放60亿消费券,今天开始全天可以领,金额在5元30元之少儿编程到底有多重要!看看科技大佬和他们的孩子都在学就知道了长久以来,有许多家长对于儿童的编程教育,会有一个常见的误区,认为学习编程就是让孩子写代码,是培养年轻的程序员。其实不然,下面我们先来看看各领域的大佬们是如何看待编程的吧。人工智能的6月起平台将限制未成年人上网消费打赏中华人民共和国未成年人保护法修订案经十三届全国人大常委会第22次会议表决通过,将于今年6月1日正式施行。新修订的未成年人保护法增设了网络保护专章,从立法角度为未成年人提供网络保护。降低价格对华出售光刻机!媒体对国内而言是好消息也是坏消息在过去两年多时间里,国内半导体领域都在承受着巨大压力。伴随着华为事件不断发酵,国内在半导体领域问题越加明显,虽然国内的华为中芯国际等有能力研发芯片,但不得不承认的是,在芯片制造方面助力五一出行腾讯地图北斗打造极致精准导航体验伴随北斗全球卫星导航系统星座部署全面完成,腾讯地图全方位支持使用北斗卫星系统进行导航,腾讯地图北斗系统将为用户打造更加优质的精准导航体验。依托北斗卫星全球组网,腾讯地图将充分发挥自