涓婄瘒鏂囩珷浠嬬粛浜哃RU绠楁硶锛屼粖澶╂墦绠椾粙缁嶄竴涓婰FU绠楁硶銆備笂涓€绡囨枃绔犳彁鍒拌繃锛孡FU锛圠eastfrequentlyused锛氭渶灏戜娇鐢級绠楁硶鍜孡RU绠楁硶鍙槸娣樻卑绛栫暐涓嶅悓銆侺RU鍊惧悜浜庝繚鐣欐渶杩戜娇鐢ㄧ殑鏁版嵁锛岃€孡FU鍊惧悜浜庝繚鐣欐洿棰戠箒浣跨敤鐨勬暟鎹€傛暟鎹€備妇涓畝鍗曠殑馃尠锛氱紦瀛樹腑鏈堿銆丅涓ゆ潯鏁版嵁锛屽凡缁忚揪鍒颁笂闄愩€傚鏋滃厛璁块棶鏁版嵁A10娆★紝鍐嶈闂暟鎹瓸涓€娆★紝褰撴柊鏁版嵁C瀛樺叆鏃讹紝濡傛灉褰撳墠鏄疞RU绠楁硶锛屽垯娣樻卑鏁版嵁A锛屽鏋滄槸LFU绠楁硶锛屽垯娣樻卑鏁版嵁B.绠€鍗曟潵璇达紝鍦↙RU绠楁硶涓紝涓嶇璁块棶棰戠巼濡備綍锛屽彧瑕佹槸鏈€杩戣闂繃鐨勶紝鏁版嵁閮戒笉浼氳娣樻卑銆傚湪LFU绠楁硶涓紝璁块棶棰戠巼浣滀负鏉冮噸銆傚彧瑕佽闂鐜囪秺楂橈紝鏁版嵁灏变細琚窐姹般€傚畠琚窐姹扮殑鍙兘鎬ц秺灏忥紝鍗充娇鏁版嵁宸茬粡寰堥暱鏃堕棿娌℃湁琚闂繃銆傜畻娉曞疄鐜版垜浠繕鏄€氳繃涓€娈礘avaScript浠g爜鏉ュ疄鐜拌繖涓€昏緫銆俢lassLFUCache{freqs={}//鐢ㄤ簬鏍囪璁块棶棰戠巼cache={}//鐢ㄤ簬缂撳瓨鎵€鏈夋暟鎹甤apacity=0//缂撳瓨鏋勯€犲嚱鏁扮殑鏈€澶у閲?capacity){//瀛樺偍鏈€澶у彲浠ヨ闂殑瀹归噺琚獿FUthis缂撳瓨銆俢apacity=capacity}}鍜孡RU绠楁硶涓€鏍凤紝LFU绠楁硶涔熼渶瑕佸疄鐜癵et鍜宲ut鏂规硶鏉ヨ幏鍙栧拰璁剧疆缂撳瓨銆俢lassLFUCache{//鑾峰彇缂撳瓨get(key){}//璁剧疆缂撳瓨put(key,value){}}鑰佽鐭╋紝鍏堢湅璁剧疆缂撳瓨鐨勯儴鍒嗐€傚鏋滅紦瀛樼殑閿箣鍓嶅瓨鍦紝鍒欓渶瑕佹洿鏂板叾鍊笺€俢lassLFUCache{//cache鏄€嬧€嬬紦瀛樼殑瀛樺偍瀵硅薄//鍏惰В鏋勪负锛歿key:{freq:0,value:''}}//freq琛ㄧず璇诲彇鏁版嵁鐨勯鐜囷紱//value琛ㄧず缂撳瓨鐨勬暟鎹紱cache={}//鐢ㄤ簬瀛樺偍缂撳瓨鏁版嵁鐨刦regs鐨勯鐜?/鍏惰В鏋勪负锛歿0:[a],1:[b,c],2:[d]}//琛ㄧずa灏氭湭琚鍙?b/c鍚勮涓€娆★紝d璇讳袱娆reqs={}//璁剧疆缂撳瓨put(key,value){//鍏堝垽鏂紦瀛樻槸鍚﹀瓨鍦╟onstcache=this.cache[key]if(cache){//濡傛灉瀛樺湪锛屽垯閲嶇疆缂撳瓨鍊糲ache.value=value//鏇存柊浣跨敤棰戠巼let{freq}=cache//浠巉reqs涓幏鍙杒ey瀵瑰簲鐨刢onst鏁扮粍keys=this.freqs[freq]constindex=keys.indexOf(key)//浠庨鐜囨暟缁勪腑鍒犻櫎瀵瑰簲鐨刱eykeys.splice(index,1)if(keys.length===0){//濡傛灉褰撳墠棰戠巼涓嶅瓨鍦╧ey//灏变細bekeydeletedeletethis.freqs[freq]}//鏇存柊棰戠巼鍔?freq=(cache.freq+=1)//鏇存柊棰戠巼鏁扮粍constfreqMap=this.freqs[freq]||(this.freqs[freq]=[])freqMap.push(key)return}}}濡傛灉缂撳瓨涓嶅瓨鍦紝鍏堝垽鏂紦瀛樻槸鍚﹁秴鍑哄閲忋€傚鏋滄槸杩欐牱锛屽垯闇€瑕佸墧闄や娇鐢ㄩ鐜囨渶浣庣殑鏁版嵁銆俢lassLFUCache{//鏇存柊棰戠巼active(key,cache){//鏇存柊棰戠巼let{freq}=cache//浠巉reqs涓幏鍙杒ey瀵瑰簲鐨勬暟缁刢onstkeys=this.freqs[freq]constindex=keys.indexOf(key)//浠庨鐜囨暟缁勪腑鍒犻櫎瀵瑰簲鐨刱eykeys.splice(index,1)if(keys.length===0){//濡傛灉褰撳墠棰戠巼涓嶅瓨鍦╧ey//鍒犻櫎keydeletethis.freqs[freq]}//鏇存柊棰戠巼鍔?freq=(cache.freq+=1)//鏇存柊璇诲彇棰戠巼鏁扮粍constfreqMap=this.freqs[freq]||(this.freqs[freq]=[])freqMap.push(key)}//璁剧疆缂撳瓨put(key,value){//鍏堝垽鏂紦瀛樻槸鍚﹀瓨鍦╟onstcache=this.cache[key]if(cache){//濡傛灉瀛樺湪锛屽垯閲嶇疆缂撳瓨鐨勫€糲ache.value=valuethis.active(key,cache)return}//鍒ゆ柇缂撳瓨鏄惁瓒呰繃瀹归噺constlist=Object.keys(this.cache)if(list.length>=this.capacity){//瓒呰繃瀛樺偍澶у皬锛屽垹闄よ闂鐜囨渶浣庣殑鏁版嵁const[first]=Object.keys(this.freqs)constkeys=this.freqs[first]constlatest=keys.shift()鍒犻櫎this.cache[latest]if(keys.length===0)deletethis.freqs[latest]}//鍐欏叆缂撳瓨锛岄粯璁ら鐜囦负0锛岃〃绀鸿繕娌℃湁琚娇鐢ㄣ€倀his.cache[key]={value,freq:0}//璇诲啓棰戠巼鏁扮粍constfreqMap=this.freqs[0]||(this.freqs[0]=[])freqMap.push(key)}}瀹炵幇璁剧疆缂撳瓨鐨勬柟娉曞悗锛屽緢瀹规槗鑾峰彇缂撳瓨绫籐RUCache{//鑾峰彇鏁版嵁get(key){if(this.cache[key]!==undefined){//濡傛灉key瀵瑰簲鐨勭紦瀛樺瓨鍦紝鍒欐洿鏂板叾璇诲彇棰戠巼//涔嬪墠宸茬粡瀹炵幇浜嗭紝this.active(key)鍙互鐩存帴澶嶇敤returnthis.cache[key]}returnundefined}}LFU缂撳瓨绠楁硶鎵ц鍒版缁撴潫銆傚綋鐒讹紝绠楁硶涓€鑸兘鏄互鍙屽悜閾捐〃鐨勫舰寮忓疄鐜扮殑銆傝繖閲岀殑瀹炵幇鏂规硶鍙槸涓轰簡鏂逛究鐞嗚В鍏跺師鐞嗐€傛湁鍏磋叮鐨勫彲浠ヤ笂缃戞悳绱㈡洿楂樻晥鐨勫疄鐜版柟寮忋€?/p>
