You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
LRUCache.prototype.set=function(key,value){if(typeofkey==='undefined'||typeofvalue==='undefined')thrownewError('key or value is undefined')if(typeofthis.map[key]!=='undefined'){this.update(key)this.map[key]=value}else{// 判断容量是否满if(this.keys.length==this.limit){// 淘汰首位deletethis.map[this.keys[0]]this.keys.splice(0,1)}// 插入新值this.keys.push(key)this.map[key]=value}}
1. FIFO 算法实现
FIFO (First Input First Output)可以说是最简单的一种缓存算法,通过设置缓存上限,当达到了缓存上限的时候,按照先进先出的策略进行淘汰,再增加进新的 key-value。
实现的可以创建一个
map
对象来保存键值信息然后创建
keys
的数组用来进行淘汰判断代码示例:
实现
get
函数其实很简单,通过map返回对应值就行代码示例:
在
set
函数中,先keys
长度是否达到限制没达到限制直接追加
如果达到限制判断key是否已经存在,存在将
key
删除,否则默认删除keys
的第一个数据与对应map
中的值代码示例:
2. LRU 算法实现
LRU(Least recently used)算法算是最常见的缓存淘汰算法,根据数据的历史访问记录来进行淘汰数据,其核心思想是如果数据最近被访问过,那么将来被访问的几率也更高。
如果你搜索java的LRU实现,很多都是通过
LinkedHashMap
来实现的。我这里就照着网上搜索的相关原理通过js来实现一下。这里稍微注意的是淘汰的方向,有的是淘汰数组最前的,有的是淘汰最后的。可最后的效果都差不多,这里的话我就以淘汰首位的数据来举例编写。
开始的代码跟上面的FIFO实现差不多
代码示例:
实现
get
函数一样是通过map
返回对应值,不过需要这里多了一个update
函数,用来切换key
位置,将最新访问的数据置到最后。代码示例:
set
函数判断map
中key
是否存在,存在直接修改值并更新key
在keys
中的位置如果不存在,判断
keys
是否已满,满则删除首位数据,然后将最新数据追加到末位代码示例:
以下是通过Map实现代码参考:
3. LFU 算法实现
LFU(Least Frequently Used ) 也是一种常见的缓存算法。当空间满时,通过访问次数,淘汰访问次数最小的数据。
如果访问次数全部一样则默认淘汰最初添加的数据
根据需求,定义一个
freqMap
用来保存访问频率数据代码示例:
get
函数跟上面的LRU算法的差不多,不过这里this.map
里所保存的对象格式为代码示例:
所以更新频率的时候通过对象保存的
freq
字段从频率记录this.freqMap
中寻找,删除原始记录后重新追加到新的记录代码示例:
set
函数判断逻辑跟LRU的差不多,区别在容量满的时候,默认取freqMap
中第一个索引对应的keys数组中第一个key,删除key对应的数据代码示例:
The text was updated successfully, but these errors were encountered: