java lfu cache_lfu-cache(需要O(1),所以挺难的)

public classLFUCache {private Node head = null;private int cap = 0;private HashMap valueHash = null;private HashMap nodeHash = null;public LFUCache(intcapacity) {this.cap =capacity;

valueHash= new HashMap();

nodeHash= new HashMap();

}public int get(intkey) {if(valueHash.containsKey(key)) {

increaseCount(key);returnvalueHash.get(key);

}return -1;

}public void set(int key, intvalue) {if ( cap == 0 ) return;if(valueHash.containsKey(key)) {

valueHash.put(key, value);

Node node=nodeHash.get(key);

node.keys.remove(key);

node.keys.add(key);

}else{if (valueHash.size()

valueHash.put(key, value);

}else{

removeOld();

valueHash.put(key, value);

}

addToHead(key);

}

increaseCount(key);

}private void addToHead(intkey) {if (head == null) {

head= new Node(0);

head.keys.add(key);

}else if (head.count > 0) {

Node node= new Node(0);

node.keys.add(key);

node.next=head;

head.prev=node;

head=node;

}else{

head.keys.add(key);

}

nodeHash.put(key, head);

}private void increaseCount(intkey) {

Node node=nodeHash.get(key);

node.keys.remove(key);if (node.next == null) {

node.next= new Node(node.count+1);

node.next.prev=node;

node.next.keys.add(key);

}else if (node.next.count == node.count+1) {

node.next.keys.add(key);

}else{

Node tmp= new Node(node.count+1);

tmp.keys.add(key);

tmp.prev=node;

tmp.next=node.next;

node.next.prev=tmp;

node.next=tmp;

}

nodeHash.put(key, node.next);if (node.keys.size() == 0) remove(node);

}private voidremoveOld() {if (head == null) return;int old = 0;for (intn: head.keys) {

old=n;break;

}

head.keys.remove(old);if (head.keys.size() == 0) remove(head);

nodeHash.remove(old);

valueHash.remove(old);

}private voidremove(Node node) {if (node.prev == null) {

head=node.next;

}else{

node.prev.next=node.next;

}if (node.next != null) {

node.next.prev=node.prev;

}

}classNode {public int count = 0;public LinkedHashSet keys = null;public Node prev = null, next = null;public Node(intcount) {this.count =count;

keys= new LinkedHashSet();

prev= next = null;

}

}

}/*** Your LFUCache object will be instantiated and called as such:

* LFUCache obj = new LFUCache(capacity);

* int param_1 = obj.get(key);

* obj.set(key,value);*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值