使用Swift模擬Window-LFU

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



發佈了143 篇原創文章 · 獲贊 191 · 訪問量 62萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章