使用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就是一个删除方法
使用Swift模拟Window-LFU的更多相关文章
- 模拟window系统的“回收站”
若要模拟window系统的“回收站”功能,具体的要求如下: 对于列表中的图片,可以通过拖动或单击“删除”的链接,以动画的方式移至“回收站”. 对于“回收站的图片”,可以通过拖动和单击“还原”的链接,以 ...
- js 模拟window.open 打开新窗口
为什么要去模拟window.open() 打开一个 新的窗口呢,因为有些浏览器默认会拦截 window.open, 当需要函数中打开新窗口时,接可以使用a标签去模拟打开. /** * a模拟windo ...
- 模拟window桌面实现
正在开发中的游戏有个全屏功能--可以在window桌面背景上运行,就像一些视频播放器在桌面背景上播放一样的,花了个上午整了个Demo放出来留个纪念. 实现功能:显示图标,双击图标执行相应的程序,右击图 ...
- 在uwp仿制WPF的Window
移植WPF软件到uwp时碰到用作对话框的Window有多种处理选择.我个人认为最省事的是用ContentDialog模拟Window. 比如你想把上面这个WPF窗体弄到uwp里面去 1.修改Conte ...
- QTableWidget详解(样式、右键菜单、表头塌陷、多选等)
在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件,网上的资料不少,但是都是最基本的,有一些比较经常遇到的问题也说得不太清楚.所以,今天就在这里总结一下! 以下为个人模拟Windo ...
- jQuery 学习笔记
jQuery 学习笔记 一.jQuery概述 宗旨: Write Less, Do More. 基础知识: 1.符号$代替document.getElementById( ...
- 几个非常有用的js小函数
function $(v){ if(typeof v==="function"){ window.onload=v; }else if(typeof v==="strin ...
- QTableWidget详解(样式、右键菜单、表头塌陷、多选等) 2013-10-23 10:54:04
一.设置表单样式 点击(此处)折叠或打开 table_widget->setColumnCount(4); //设置列数 table_widget->horizontalHeader()- ...
- 每一个成功的程序员的身后都有一个--------Parse
相信好多同行都用过Parse,而正是因为Parse给我们的开发带来的极大的便利,才有了项目从零开始,到正式上线仅仅用上不到两周的时间,现在Swift还在迅速的发展,很快就会占有大量的市场,现在就就结合 ...
随机推荐
- 如何选安卓android|linux系统开发板,简化学习难度,缩短开发进程
平台一:iTOP-4412精英版 系统支持:Android 4.0.3系统 / Android 4.4系统 / Linux + Qt系统 / Ubuntu12.04系统 开发板特点:Cortex-A ...
- Java处理ZIP文件的解决方案——Zip4J(不解压直接通过InputStream形式读取其中的文件,解决中文乱码)
一.JDK内置操作Zip文件其实,在JDK中已经存在操作ZIP的工具类:ZipInputStream. 基本使用: public static Map<String, String> re ...
- Mac OS 使用asio库
下载地址:http://sourceforge.net/projects/asio/files/asio/1.12.2%20%28Stable%29/ 本人下载的版本:asio-1.12.2 1,本人 ...
- NET使用SuperSocket完成TCP/IP通信
1)为什么使用SuperSocket? 性能高,易上手.有中文文档,我们可以有更多的时间用在业务逻辑上,SuperSocket有效的利用自己的协议解决粘包 2)SuperSocket的协议内容? 命令 ...
- 2D热力图实例
<div style="height: 100px; width: 200px" id="heatmap"></div> <scr ...
- 18mybatis
18mybatis-2018/08/02 1.mybatis标签 定义SQL语句 id :唯一的标识符 parameterType:传给此语句的参数的全路径名或别名例:com.test.poso.Us ...
- mysql出现问题汇总(持续更新)
1.mysql -uqwe -p普通用户登陆时提示: ERROR 1045 (28000): Access denied for user 'baijie'@'%' (using password: ...
- SQL中带有NOT IN 子查询改写
报表程序中的一段SQL运行很慢,代码如下: 优化前: 耗时:1337s INSERT INTO PER_LTE_ZIB_PB_COMMISSION_07 SELECT P.TOPACTUALID, Q ...
- 新增feeds模块
很简单,参考<产品差异化定制> 1.在fees/luci/model下面新增文件夹,必须的有:Makefile 和 luasrc/controller/admin/xxx.lua 2.执行 ...
- assert.notDeepEqual()
assert.notDeepEqual(actual, expected[, message]) 深度地不相等比较测试,与 assert.deepEqual() 相反. const assert = ...