当前位置: 首页 > 面试题库 >

请你讲讲LFU算法的实现原理?

微生永春
2023-03-14
本文向大家介绍请你讲讲LFU算法的实现原理?相关面试题,主要包含被问及请你讲讲LFU算法的实现原理?时的应答技巧和注意事项,需要的朋友参考一下

考察点:LFU Cache

public class LFUCache {
private class Node{
    int value;
    ArrayList<Integer> set;
    Node prev;
    Node next;
    public Node (int value ){
        this.value = value;
        this.set = new ArrayList<Integer> ();
        this.prev = null;
        this.next = null;
    }
}
private class item{
    int key;
    int value;
    Node parent ;
    public item(int key ,int value, Node parent){
         this.key = key ;
         this.value = value;
         this.parent  = parent;
    }
}
 private HashMap<Integer, item> map;
private  Node head,tail;
private  int capacity;
// @param capacity, an integer
public LFUCache(int capacity) {
    // Write your code here
    this.capacity = capacity;
    this.map = new HashMap <Integer,item> ();
    this.head = new Node (0);
    this.tail = new Node(Integer.MAX_VALUE);
    head.next = tail;
    tail.prev = head;
     
     
}
// @param key, an integer
// @param value, an integer
// @return nothing
public void set(int key, int value) {
    // Write your code here
   if (get(key) != -1 ) {
      map.get(key).value = value;
      return ;
   }
   if (map.size() == capacity ){
       getLFUitem();
   }
   
   Node newpar = head.next;
   if ( newpar.value != 1){
       newpar = getNewNode(1,head,newpar);
   }
    item curitem = new item(key,value,newpar);
    map.put(key,curitem);
    newpar.set.add(key);
    return;  
}
public int get(int key) {
    // Write your code here
    if (!map.containsKey(key)){
        return -1;
    }
    item cur = map.get(key);
    Node curpar = cur.parent;
    if (curpar.next.value == curpar.value + 1){
        cur.parent= curpar.next;
        cur.parent.set.add(key);
    }else{
        Node newpar =getNewNode(curpar.value + 1,curpar,curpar.next);
        cur.parent = newpar;
        newpar.set.add(key);
    }
     curpar.set.remove(new Integer(key));
     if(curpar.set.isEmpty()){
         deleteNode(curpar);
     }
    return cur.value;
}
private Node getNewNode (int value ,Node prev , Node next){
    Node temp = new Node(value);
    temp.prev = prev;
    temp.next = next;
    prev.next = temp;
    next.prev = temp;
    return temp;
}
private void deleteNode(Node temp){
    temp.prev.next = temp.next;
    temp.next.prev = temp.prev;
    return ;
}
private void getLFUitem(){
    Node temp = head.next;
     int LFUkey = temp.set.get(0);
    temp.set.remove(0);
    map.remove(LFUkey);
    if (temp.set.isEmpty()){
        deleteNode(temp);
    }
    return;
}

 

 类似资料:
  • 本文向大家介绍请你讲讲LRU算法的实现原理?相关面试题,主要包含被问及请你讲讲LRU算法的实现原理?时的应答技巧和注意事项,需要的朋友参考一下 考察点:LRU算法   ①LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也很高”,反过来说“如果数据最近这段时间一直都没有访问,那么将来被访问

  • 本文向大家介绍请你讲讲wait方法的底层原理相关面试题,主要包含被问及请你讲讲wait方法的底层原理时的应答技巧和注意事项,需要的朋友参考一下 考察点:基础 ObjectSynchronizer::wait方法通过object的对象中找到ObjectMonitor对象调用方法 void ObjectMonitor::wait(jlong millis, bool interruptible, TR

  • 本文向大家介绍请你讲讲&和&&的区别?相关面试题,主要包含被问及请你讲讲&和&&的区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:运算符 &运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右

  • 本文向大家介绍请你讲讲http1.1和1.0的区别相关面试题,主要包含被问及请你讲讲http1.1和1.0的区别时的应答技巧和注意事项,需要的朋友参考一下 考察点:http   主要区别主要体现在: 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Un

  • 本文向大家介绍请你讲讲什么是泛型?相关面试题,主要包含被问及请你讲讲什么是泛型?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA泛型 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时

  • 本文向大家介绍请讲讲,你如何看待加班?相关面试题,主要包含被问及请讲讲,你如何看待加班?时的应答技巧和注意事项,需要的朋友参考一下