zoukankan      html  css  js  c++  java
  • 用JAVA实现一个简单LRU算法

    一个LRU算法最简单的有如下的功能:这里我们先不考虑用哈希表做优化

    实际上就是一个链表,通过链表来模拟实现

    public class Linked {
    // 用链表实现一个LRU缓存 (大小为100),要求实现添加一个数据的方法。(自己定义节点类,存储的数据类型为int)。
    public static void main(String args[]){
    ListLRU lru = new ListLRU(6);
    lru.addNode(5);
    lru.addNode(4);
    lru.addNode(3);
    lru.addNode(2);
    lru.addNode(1);
    lru.printLRU();
    lru.addNode(6);
    lru.printLRU();
    lru.addNode(3);
    lru.printLRU();
    lru.addNode(7);
    lru.printLRU();
    }
    }
    public class ListLRU { //带头结点的单链表,根据题意,所有结点值不同
    static int lenLimit;
    static Node headNode = new Node(-1);//结点值-1表示这是头结点
    public ListLRU(int lenLimit){
    this.lenLimit = lenLimit;
    }

    static public int length(){
    int length = 0;
    Node scan = headNode;
    while(scan.next!=null){
    scan=scan.next;
    length++;

    }
    return length;
    }

    //添加的逻辑:
    public void addNode(int value){
    Node newone = new Node(value);//先创建一个待加入的新结点
    Node p = headNode;

    while(p.value != newone.value&&p.next!=null){
    p=p.next;
    }
    //出循环两种可能,遍历结束没有找到,或者是找到了
    if(p.next == null){//遍历完了没有找到
    int len=ListLRU.length();
    if(len<lenLimit){ //不需要删除,直接在头部添加
    newone.next = headNode.next;
    headNode.next = newone ;

    }else{

    //先删除最后一个结点
    deleteNode(p.value);
    //再在列表头部添加
    newone.next = headNode.next;
    headNode.next = newone;
    }
    }else{ //找到了这个结点,删除,在头部添加
    deleteNode(p.value);
    newone.next = headNode.next;
    headNode.next = newone;
    }

    }


    public boolean deleteNode(int value){
    Node p = headNode;
    Node pre = null;
    while(p.value!=value&&p.next!=null){
    pre = p;
    p = p.next;
    }
    //跳出循环有两种可能:找到要删除的结点了,或者到达末尾了
    if(p.value == value){ //说明是找到了
    pre.next = p.next;
    return true;

    }else{ //到了末尾还没有,返回异常
    return false;
    }
    }
    public void printLRU(){
    Node p = headNode;
    if(p.next == null) System.out.println("LRU链表当前无结点");
    while(p.next!= null){
    p = p.next;
    System.out.print(p.value+" ");
    }
    System.out.println();
    }
    }
    public class Node {
    int value=-1;
    Node next=null;
    public Node(int value,Node next){
    this.value = value;
    this.next = next;
    }
    public Node(int value){
    this.value = value;
    }
    }

  • 相关阅读:
    Flutter TextField 文本输入框的基本属性
    Flutter 之网络请求Dio, FormData, 表单网络请求, x-www-form-urlencoded
    操作DataTable数据,修改某列的值
    获取DataTable某一列所有值
    ajax将数据遍历给select的option选项
    Flutter 获取网络数据及渲染列表
    Flutter实现APP版本更新
    Flutter 一些常用库插件
    flutter_screenutil屏幕適配
    前端组件学习
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/13295825.html
Copyright © 2011-2022 走看看