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

使用Swift模拟Window-LFU的更多相关文章

  1. 模拟window系统的“回收站”

    若要模拟window系统的“回收站”功能,具体的要求如下: 对于列表中的图片,可以通过拖动或单击“删除”的链接,以动画的方式移至“回收站”. 对于“回收站的图片”,可以通过拖动和单击“还原”的链接,以 ...

  2. js 模拟window.open 打开新窗口

    为什么要去模拟window.open() 打开一个 新的窗口呢,因为有些浏览器默认会拦截 window.open, 当需要函数中打开新窗口时,接可以使用a标签去模拟打开. /** * a模拟windo ...

  3. 模拟window桌面实现

    正在开发中的游戏有个全屏功能--可以在window桌面背景上运行,就像一些视频播放器在桌面背景上播放一样的,花了个上午整了个Demo放出来留个纪念. 实现功能:显示图标,双击图标执行相应的程序,右击图 ...

  4. 在uwp仿制WPF的Window

    移植WPF软件到uwp时碰到用作对话框的Window有多种处理选择.我个人认为最省事的是用ContentDialog模拟Window. 比如你想把上面这个WPF窗体弄到uwp里面去 1.修改Conte ...

  5. QTableWidget详解(样式、右键菜单、表头塌陷、多选等)

    在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件,网上的资料不少,但是都是最基本的,有一些比较经常遇到的问题也说得不太清楚.所以,今天就在这里总结一下! 以下为个人模拟Windo ...

  6. jQuery 学习笔记

    jQuery 学习笔记   一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById( ...

  7. 几个非常有用的js小函数

    function $(v){ if(typeof v==="function"){ window.onload=v; }else if(typeof v==="strin ...

  8. QTableWidget详解(样式、右键菜单、表头塌陷、多选等) 2013-10-23 10:54:04

    一.设置表单样式 点击(此处)折叠或打开 table_widget->setColumnCount(4); //设置列数 table_widget->horizontalHeader()- ...

  9. 每一个成功的程序员的身后都有一个--------Parse

    相信好多同行都用过Parse,而正是因为Parse给我们的开发带来的极大的便利,才有了项目从零开始,到正式上线仅仅用上不到两周的时间,现在Swift还在迅速的发展,很快就会占有大量的市场,现在就就结合 ...

随机推荐

  1. 利用nginx与nginx-rtmp-module搭建流媒体服务器实现直播

    使用环境是centos 7.0+nginx:可以实现简单的流媒体服务. 先下载nginx-rtmp-module拓展: nginx-rtmp-module的官方github地址:https://git ...

  2. Java Socket 连接 Client端 和 Server端

    Client端: import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;i ...

  3. jQuery 价格显示 前面位数与后面两位显示不同样式(一大一小)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. viewport 640宽的做法 针对iphone和安卓单独设置

    <!DOCTYPE html> <html lang="ch"> <head> <meta charset="utf-8&quo ...

  5. pavenet资源

    网络结构:http://www.cnblogs.com/fariver/p/7449563.html 源码:https://github.com/sanghoon/pva-faster-rcnn 训练 ...

  6. SQL函数解释(待补)

    1.SQL— CONCAT(字符串连接函数) 有的时候,我们有需要将由不同栏位获得的资料串连在一起.每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT() Oracle: CONCA ...

  7. UTF-8,UTF-16

    UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思. 在Unicode基本多文种平面定义的字符(无论是拉丁字母.汉字或其他文字或符号),一律使用2字节 ...

  8. HYSBZ - 3750 Pieczęć(模拟)

    题目: 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色. 你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要满足以下要求: ...

  9. nodejs学习(一) ---- nodejs + express应用生成器 快速创建应用

    1.node安装及环境配置(自行百度) 2.express安装及配置 (自行百度) 3.通过应用生成器工具 express 快速创建应用骨架   全局安装应用生成器 : npm install exp ...

  10. buf.equals()

    buf.equals(otherBuffer) otherBuffer {Buffer} 返回:{Boolean} 返回一个 boolean 标识,无论 this 和 otherBuffer 是否具有 ...