今天參加了某公司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. 如何选安卓android|linux系统开发板,简化学习难度,缩短开发进程

    平台一:iTOP-4412精英版 系统支持:Android 4.0.3系统  / Android 4.4系统 / Linux + Qt系统 / Ubuntu12.04系统 开发板特点:Cortex-A ...

  2. Java处理ZIP文件的解决方案——Zip4J(不解压直接通过InputStream形式读取其中的文件,解决中文乱码)

    一.JDK内置操作Zip文件其实,在JDK中已经存在操作ZIP的工具类:ZipInputStream. 基本使用: public static Map<String, String> re ...

  3. Mac OS 使用asio库

    下载地址:http://sourceforge.net/projects/asio/files/asio/1.12.2%20%28Stable%29/ 本人下载的版本:asio-1.12.2 1,本人 ...

  4. NET使用SuperSocket完成TCP/IP通信

    1)为什么使用SuperSocket? 性能高,易上手.有中文文档,我们可以有更多的时间用在业务逻辑上,SuperSocket有效的利用自己的协议解决粘包 2)SuperSocket的协议内容? 命令 ...

  5. 2D热力图实例

    <div style="height: 100px; width: 200px" id="heatmap"></div> <scr ...

  6. 18mybatis

    18mybatis-2018/08/02 1.mybatis标签 定义SQL语句 id :唯一的标识符 parameterType:传给此语句的参数的全路径名或别名例:com.test.poso.Us ...

  7. mysql出现问题汇总(持续更新)

    1.mysql -uqwe -p普通用户登陆时提示: ERROR 1045 (28000): Access denied for user 'baijie'@'%' (using password: ...

  8. SQL中带有NOT IN 子查询改写

    报表程序中的一段SQL运行很慢,代码如下: 优化前: 耗时:1337s INSERT INTO PER_LTE_ZIB_PB_COMMISSION_07 SELECT P.TOPACTUALID, Q ...

  9. 新增feeds模块

    很简单,参考<产品差异化定制> 1.在fees/luci/model下面新增文件夹,必须的有:Makefile 和 luasrc/controller/admin/xxx.lua 2.执行 ...

  10. assert.notDeepEqual()

    assert.notDeepEqual(actual, expected[, message]) 深度地不相等比较测试,与 assert.deepEqual() 相反. const assert = ...