zoukankan      html  css  js  c++  java
  • 使用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就是一个删除方法



  • 相关阅读:
    特殊字符大全
    ASP執行文件下載
    在 Access 里使用查询建立 存储过程/视图, 并使用 ASP 执行
    通過windows的排定工作來執行存儲過程
    前台页面中用js取得eWebEditor的值
    IE7外觀優化
    电话订票
    在BIOS设置“扩展或板载”显卡的方法
    子窗口中操作父窗口对像(javascript)(转)
    mailto用法
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7144315.html
Copyright © 2011-2022 走看看