GPT-SoVITS能否还原不同录音设备的声音特性?
2025/12/24 13:11:58
| LRU | LFU | |
|---|---|---|
| 原理 | 淘汰最久未被访问的数据 | 淘汰访问次数最少的数据 |
| 复杂度 | O(1) | O(1)合理实现时 |
| 优点 | 实现简单,时间开销小 | 保护长期高频数据,减少冷数据回流 |
| 缺点 | 容易"误杀"最近高配数据 | 实现较复杂,突发热点响应慢 |
电商常见的数据访问模式:
选择建议:
/** * LRU缓存(基于双向链表+哈希表) */publicclassLRU<K,V>{privatefinalintcapacity;privatefinalMap<K,Node<K,V>>map;privatefinalNode<K,V>head,tail;staticclassNode<K,V>{Kkey;Vvalue;Node<K,V>prev,next;Node(){}Node(Kkey,Vvalue){this.key=key;this.value=value;}}publicLRU(intcapacity){this.capacity=capacity;this.map=newHashMap<>();head=newNode<>();tail=newNode<>();head.next=tail;tail.prev=head;}publicVget(Kkey){Node<K,V>node=map.get(key);if(node==null){returnnull;}moveToHead(node);returnnode.value;}publicvoidput(Kkey,Vvalue){Node<K,V>node=map.get(key);if(node==null){node=newNode<>(key,value);map.put(key,node);addToHead(node);if(map.size()>capacity){Node<K,V>tail=removeTail();map.remove(tail.key);}else{node.value=value;addToHead(node);}}}/** * 添加节点 * @param node */privatevoidaddToHead(Node<K,V>node){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}/** * 删除节点 * @param node */privatevoidremoveNode(Node<K,V>node){node.prev.next=node.next;node.next.prev=node.prev;}/** * 移动节点到头部 * @param node */privatevoidmoveToHead(Node<K,V>node){node.prev.next=node.next;node.next.prev=node.prev;addToHead(node);}/** * 删除尾部节点 * @return */privateNode<K,V>removeTail(){Node<K,V>node=tail.prev;node.prev.next=tail;tail.prev=node.prev;returnnode;}}/** * LFU缓存(基于HashMap+频率链表) */publicclassLFU<K,V>{privateintcapacity;privateintminFreq;privatefinalMap<K,Node<K,V>>nodeMap;privatefinalMap<Integer,LinkedHashSet<Node<K,V>>>freqMap;staticclassNode<K,V>{Kkey;Vvalue;intfreq;Node(Kkey,Vvalue){this.key=key;this.value=value;this.freq=1;}}publicLFU(intcapacity){this.capacity=capacity;this.minFreq=0;this.nodeMap=newHashMap<>();this.freqMap=newHashMap<>();}publicVget(Kkey){Node<K,V>node=nodeMap.get(key);if(node==null)returnnull;increaseFreq(node);returnnode.value;}publicvoidput(Kkey,Vvalue){if(capacity<=0)return;if(nodeMap.containsKey(key)){Node<K,V>node=nodeMap.get(key);node.value=value;increaseFreq(node);return;}if(nodeMap.size()==capacity){// 淘汰访问频率最低且最久的节点LinkedHashSet<Node<K,V>>set=freqMap.get(minFreq);Node<K,V>toRemove=set.iterator().next();set.remove(toRemove);nodeMap.remove(toRemove.key);}Node<K,V>newNode=newNode<>(key,value);nodeMap.put(key,newNode);freqMap.computeIfAbsent(1,k->newLinkedHashSet<>()).add(newNode);minFreq=1;}privatevoidincreaseFreq(Node<K,V>node){intfreq=node.freq;LinkedHashSet<Node<K,V>>set=freqMap.get(freq);set.remove(node);if(freq==minFreq&&set.isEmpty()){minFreq++;}node.freq++;freqMap.computeIfAbsent(node.freq,k->newLinkedHashSet<>()).add(node);}}publicclassCacheTest{publicstaticvoidmain(String[]args){// 测试LRU缓存LRU<Integer,String>lruCache=newLRU<>(2);lruCache.put(1,"A");lruCache.put(2,"B");System.out.println(lruCache.get(1));// 输出: AlruCache.put(3,"C");System.out.println(lruCache.get(2));// 输出: null (2被淘汰)// 测试LFU缓存LFU<Integer,String>lfuCache=newLFU<>(2);lfuCache.put(1,"A");lfuCache.put(2,"B");System.out.println(lfuCache.get(1));// 输出: AlfuCache.put(3,"C");System.out.println(lfuCache.get(2));// 输出: null (2被淘汰,因1 频率高)}}