lru算法java实现伪代码_程序员应该如何学习算法?

推荐一份资源:

一位从1998年就开始讲课的老教授Jeff Erickson,把他20年来在UIUC讲课的内容整理成了一本算法书,名字简单粗暴,就叫《算法》(Algorithms)。

这本书在网上公布后,很快就成了国外计算机系学生讨论的热门话题,在Hacker News已经收获超过1000赞。

原因当然是他在学生当中的名气。Jeff是计算机视觉领域知名学者,有扎实专业知识。难能可贵的是,他教学风格轻松愉快,广受学生欢迎,甚至一位20年前的学生也亲自发帖为他打call。

书本内容

《算法》总共有448页,,除去前言和简介部分,总共包含了12个章节的内容,主要谈到了以下一些算法:

递归、回溯、动态编程、贪心算法、基本图算法、深度优先搜索、最小生成树、最短路径、全局最短路径、最大流最小割、流量与切割的应用、NP困难等。

Jeff把这本书称作出版印刷前的“第0版”,你可以去他的GitHub页下载到《算法》这本书的PDF版,帮忙找排版和内容上的bug。

喜欢看纸质书的小伙伴也不用着急,《算法》的纸质版即将发行。至于电子版也会一直免费提供下去。

既然是讲义的整理,除了基本教学内容外,当然还有习题和考卷,每年都会根据教学内容实时更新。如果你想要随附习题的答案,Jeff本人是拒绝的,还是自己动手吧。这本书没有习题答案!

Jeff教师认为,教材有时候在大学教学和自学者之间有不可调和的矛盾。Jeff显然更看重课堂上的学生,如果提供标准答案,只会让学生死记硬背,忽略了答案背后的逻辑。

而且,Jeff说那些想要答案的学位往往是爱作弊的学生。学渣们你们颤抖了吗?

关于作者

如果仅凭以上内容,就认为Jeff是一个不讲情面的大学教授就完全错了。

在考试方面,Jeff对待学生可以说是相当“宽松”。学生在考试题下面写“我不知道”,就能得到25%的分数。

这么做是为了鼓励学生承认自己的缺点,助教也不必为审阅垃圾答案浪费时间。

有趣的是,这位Jeff教授不是一个唯成绩论的人。

因为他自己当初就是一个不折不扣的学渣,GPA得分只有2.4(满分4.0)。他却靠自身努力成为知名教授。

对那些成绩很差却想继续深造的学生,Jeff传授了一点他自己过往的人生经验:

让导师看到你的努力和在专业方面的技能,比如你曾经在计算机领域的就业经历。让导师相信,你出色的能力让他愿意承担风险。(Jeff自己在攻读硕士前就曾是软件工程师。)

最后,Jeff有个幸福的家庭,上面的画像就是他12岁女儿所画。

资源汇总

-完-

量子位 · QbitAI

վ'ᴗ' ի 追踪AI技术和产品新动态量子位​www.zhihu.comac94264df0664e4557bfe282928c8604.png

欢迎大家关注我们,以及订阅我们的知乎专栏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LRU算法(Least Recently Used)可以使用Java集合框架中的LinkedHashMap来实现,LinkedHashMap提供了一种按访问顺序排序的功能,具体实现示例如下:import java.util.*;public class LRUCache { // 容量 private int capacity; // 使用LinkedHashMap保存缓存的内容 private LinkedHashMap<Integer, Integer> cache; // 构造函数 public LRUCache(int capacity) { this.capacity = capacity; cache = new LinkedHashMap<Integer, Integer>(capacity, 0.75f, true){ // 重写removeEldestEntry方法 @Override protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) { return size() > capacity; } }; } // 根据key获取缓存内容 public int get(int key) { Integer value = cache.get(key); if (value == null) { return -1; } else { return value; } } // 存入key-value public void put(int key, int value) { cache.put(key, value); } } ### 回答2: LRU算法(Least Recently Used,最近最少使用)是一种用于缓存替换策略的算法,它保留最近使用的数据,并淘汰最久未使用的数据。以下是使用Java实现LRU算法的详细代码: ```java import java.util.HashMap; class Node { int key; int value; Node prev; Node next; public Node(int key, int value) { this.key = key; this.value = value; } } class LRUCache { private int capacity; private HashMap<Integer, Node> map; private Node head; private Node tail; public LRUCache(int capacity) { this.capacity = capacity; this.map = new HashMap<>(); this.head = new Node(0, 0); this.tail = new Node(0, 0); head.next = tail; tail.prev = head; } public int get(int key) { if (map.containsKey(key)) { Node node = map.get(key); remove(node); addToHead(node); return node.value; } return -1; } public void put(int key, int value) { if (map.containsKey(key)) { Node node = map.get(key); node.value = value; remove(node); addToHead(node); } else { if (map.size() == capacity) { map.remove(tail.prev.key); remove(tail.prev); } Node newNode = new Node(key, value); map.put(key, newNode); addToHead(newNode); } } private void addToHead(Node node) { node.next = head.next; node.next.prev = node; node.prev = head; head.next = node; } private void remove(Node node) { node.prev.next = node.next; node.next.prev = node.prev; } } ``` 本实现使用HashMap来存储缓存数据,HashMap的键为键值,值为对应的Node节点。 LRUCache类有一个构造函数用于初始化缓存容量。get方法用于获取缓存中的值,它首先判断缓存是否包含该键值,如果包含,则将对应的节点移至链表头部并返回对应的值;如果不包含则返回-1。put方法用于存储缓存数据,如果缓存中已存在该键值,则更新对应的值并将对应的节点移至链表头部;如果缓存大小已达到容量上限,则删除最久未使用的节点,并将新节点添加至链表头部。addToHead和remove方法用于调整链表节点的位置,将最近使用的节点移至链表头部,最久未使用的节点移至链表尾部。 以上就是使用Java实现LRU算法的详细代码。 ### 回答3: LRU(最近最少使用)算法是一种缓存淘汰策略,它根据缓存中数据的访问时间来进行淘汰。当缓存已满时,会淘汰掉最近最少使用的数据。下面是使用Java实现LRU算法的详细代码: ```java import java.util.HashMap; public class LRUCache { private int capacity; private HashMap<Integer, Node> cache; private Node head; private Node tail; public LRUCache(int capacity) { this.capacity = capacity; cache = new HashMap<>(); head = new Node(-1, -1); tail = new Node(-1, -1); head.next = tail; tail.prev = head; } public int get(int key) { if (cache.containsKey(key)) { Node node = cache.get(key); // 将访问的节点移到链表头部 removeNode(node); addToHead(node); return node.value; } return -1; } public void put(int key, int value) { if (cache.containsKey(key)) { Node node = cache.get(key); node.value = value; // 将访问的节点移到链表头部 removeNode(node); addToHead(node); } else { if (cache.size() == capacity) { // 移除最近最少使用的节点 cache.remove(tail.prev.key); removeNode(tail.prev); } Node newNode = new Node(key, value); cache.put(key, newNode); addToHead(newNode); } } 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; } private class Node { private int key; private int value; private Node prev; private Node next; public Node(int key, int value) { this.key = key; this.value = value; } } } ``` 以上代码实现了一个LRUCache类,里面包含了LRU算法的核心逻辑。LRUCache类有一个构造函数用于初始化缓存容量,get()方法用于获取缓存中的数据,put()方法用于往缓存中添加数据。算法通过双向链表和哈希表实现,双向链表中的节点按照访问顺序从头到尾依次排列,哈希表用于加快查找节点的速度。当缓存已满时,淘汰最近最少使用的节点,即双向链表的尾节点。对于get操作和put操作,都会将访问的节点移到链表头部,保证头部节点是最近访问的节点。这样即可以实现LRU算法的缓存淘汰策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值