今天参加了某公司2015的校招的机试,大题开放题比较多,有一道大题是Window-LFU比较有意思,当时题目搞了半天没搞明白让干啥- -题目大概是这样的:实现一个Window-LFU缓存(其实就是用数组去缓存,当时差点用NSCache去做),要在API中暴露set、get、remove方法,并且可以指定cache的长度和window的大小。我用Swift实现的,当时做的时候时间比较紧没有做的太完整,后来仔细思考了一下完善了自己的代码,只是个人的一些想法,不保证正确- -:
import Foundation
class cacheTool: NSObject {
var globalIndex = 0//全局记录时间
var cache = 0
var window = 0
init(cache:Int,window:Int){//指定cache和window大小
self.cache = cache
self.window = window
}
var tempArray = [(String,Int,Int)]()//数组用来缓存,数组的值搭配元组,分别表示值、使用次数、最近访问时间
//MARK:get方法
func get(index:Int) -> String{
globalIndex++
tempArray[index].1 = tempArray[index].1 + 1//访问1次
return tempArray[index].0
}
//MARK:set方法
func set(value:String){
globalIndex++
if tempArray.count < cache
{
tempArray.append((value,0,globalIndex))//缓存不满直接加到最后
}
else {
var min = 0
for (idx,val) in enumerate(tempArray) {
var temV = 1000
var temI = 0
if val.2 > window{//只考虑window之后这段时间
if val.1 < temV{ // 求值
temV = val.1
temI = idx
}
}
min = temI //记录下标
}
tempArray.insert((value,0,globalIndex), atIndex: min)//替换最近最少使用的
}
}
//MARK:删除
func remove(index:Int){
tempArray.removeAtIndex(index)
}
}
构造器中初始化cache和window
这里我用一个全局变量globalIndex来表示时间,每一次get和set都会使globalIndex加1,数组中存储的数据结构是个3元元组,分别表示要存储的值、访问次数和当前globalIndex。
get方法中访问次数+1
set方法中判断是否需要替换,如果需要替换再判断是否在window的阈值中
然后使用Swift中最高效的遍历方法求出最近最少使用的下标位置进行替换
remove就是一个删除方法