• 数据结构——LRU缓存、频率栈...(java)


    LRU缓存

    使用双向链表和hashmap构造存储key-value的LRU缓存结构

    import java.util.*
    
    public class Solution{
      //内部结点类
      public static class Node{
        int key, value;
        Node pre, next;
        
        public Node(int key, int value){
          this.key = key;
          this.value = value;
        }
      }
      
      private Map<Integer, Node> map = new HashMap<>(); //键值和LRU节点
      private Node head = new Node(-1, -1); //LRU链表头结点
      private Node tail = new Node(-1, -1); //LRU链表尾结点
      private int k; //LRU容量 
    
      private int get(int key){
        if(map.containsKey(key)){
          Node node = map.get(key);
          node.prev.next = node.next;
          node.next.prev = node.prev;
          moveToHead(node);
          return node.value;
        }
        return -1;
      }
    
      private void set(int key, int value){
        if(get(key) == -1){
          map.get(key).value = value;
        }else{
          if(map.size() == k){
            int rk = tail.prev.key;
            tail.prev.prev.next = tail;
            tail.prev = tail.prev.prev;
            map.remove(rk);
          }
          Node node = new Node(key, value);
          map.put(key, node);
          moveToHead(node);
        }
      }
      
      private void moveToHead(Node node){
        node.next = head.next;
        head.next.prev = node;
        head.next = node;
        node.prev = head;
      }
    
      public int[] LRU (int[][] operators, int k) {
        this.k = k;
        head.next = tail;
        tail.prev = head;
        int len = (int) Arrays.stream(operators).filter(x -> x[0]==2).count();
        int[] res = new int[len];
            
        for(int i=0, j=0; i<operators.length; i++){
          if(operators[i][0] == 1){
            set(operators[i][1], operators[i][2]);
          }else{
            res[j++] = get(operators[i][1]);
          }
        }
        return res;
      }
    }
    

    最大频率栈

    class FreqStack {
        private int maxF;
        private HashMap<Integer, Integer> numsFreq = new HashMap<>();
        private HashMap<Integer, Stack<Integer>> group = new HashMap<>();
    
        public FreqStack() {
            maxF= 0;
        }
        
        public void push(int val) {
            int tmp = numsFreq.getOrDefault(val, 0) + 1;
            if(tmp > maxF) maxF = tmp;
            numsFreq.put(val, tmp);
            Stack<Integer> st = group.get(tmp);
            if(st != null) st.push(val);
            else {
                st = new Stack<Integer>();
                st.push(val);
                group.put(tmp, st);
            }
        }
        
        public int pop() {
            int val = group.get(maxF).pop();
            numsFreq.put(val, numsFreq.get(val)-1);
            if(group.get(maxF).size() == 0){
                --maxF;
            }
            return val;
        }
    }
    
    /**
     * Your FreqStack object will be instantiated and called as such:
     * FreqStack obj = new FreqStack();
     * obj.push(val);
     * int param_2 = obj.pop();
     */
    
  • 相关阅读:
    CODING DevOps 系列课程重磅来袭!
    CODING 敏捷实战系列加餐课:CODING 做敏捷这一年
    IdentityServer4 QuickStart 授权与自定义Claims
    .NET项目升级:可为空引用
    ASP.NET CORE WEBAPI文件下载
    xunit测试无法找到testhost或没有可用测试的问题解决方法
    强迫症福利--收起.NET程序的dll来
    使用高性能Pipelines构建.NET通讯程序
    ASP.NET Core使用TopShelf部署Windows服务
    .NET Standard库引用导致的FileNotFoundException探究
  • 原文地址:https://www.cnblogs.com/bacmive/p/15067782.html
Copyright © 2020-2023  润新知