简单实现LRU算法(Least Recently Used最近最少使用)

LRU即Least Recently Used的缩写,即最近最少使用,可以用来作为路由或者淘汰算法。

算法的思想是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。正是由于这个特性,所以我们可以将使用不到的数据淘汰。

基于链表的 LRU 实现 [头部是最新的数据(访问或者插入)]
思路:每次新插入数据的时候将新数据插到链表的头部;每次缓存命中(即数据被访问),则将数据移到链表头部;那么当链表满的时候,就将链表尾部的数据淘汰。

主要构成有get和put两个方法
get时将访问的数据放到头部(访问)
put时有两种情况
1.未达到最大容量,直接头部插入数据(插入)。
2.达到最大容量,则将末尾数据删除(淘汰最少使用),然后在头部插入数据(插入)。

public class LRUSimple {
	
	private int cap = 0;
	private LinkedList<User> link = new LinkedList<>(); 
	LRUSimple(int capcity){
		this.cap=capcity;
	}
	public User get(String user){
		User u = null;
		for(User tmp:link){
			u=tmp;
			if(tmp.getUser()==user){
			//-------将数据移到头部----------
				link.remove(tmp);
				link.addFirst(tmp);
			//------------------------------
			}
		}
		return u;
	}
	
	public void put(User u){
		if(link.size()==cap){//如果达到容量则将末尾数据删除(淘汰最少使用)
			link.removeLast();
		}
		link.addFirst(u);//头部插入数据
	}
	
	public static void main(String[] args) {
		// 测试
		LRUSimple lru = new LRUSimple(3);
		lru.put(new User("hzc","5"));
		lru.put(new User("hc","5"));
		lru.put(new User("h","5"));
		lru.get("hzc");
		lru.put(new User("h2c","5"));
		System.out.println(lru.toString());
	}
	
	
	@Override
	public String toString() {
		return link.toString();
	}

//---------------------实体类----------------------------
	static class User{
		private String user;
		private String age;
		
		
		public User(String user, String age) {
			super();
			this.user = user;
			this.age = age;
		}
		public String getUser() {
			return user;
		}
		public void setUser(String user) {
			this.user = user;
		}
		public String getAge() {
			return age;
		}
		public void setAge(String age) {
			this.age = age;
		}
		@Override
		public String toString() {
			return "User [user=" + user + ", age=" + age + "]";
		}
		
	}
}

你可能感兴趣的:(算法)