使用Swift模拟Window-LFU

本文介绍了在一次校招机试中遇到的Window-LFU缓存问题,使用Swift编程语言实现包括set、get、remove方法的缓存,并考虑了缓存长度和窗口大小的设定。通过全局变量记录时间,元组存储值、访问次数和时间戳,get方法增加访问次数,set方法判断并替换最不常用项,remove方法进行删除。
摘要由CSDN通过智能技术生成

  今天参加了某公司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就是一个删除方法



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值