今天參加了某公司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就是一個刪除方法