今天參加了某公司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. Java基础知识强化98.01:Jsp和servlet有什么区别

    1. Jsp和servlet有什么区别 首先你先要弄懂什么是servlet,servlet是在服务器端执行的java程序,只不过它有专门的一套规则(就是我们平常所说的api):jsp说得简单点就是用另 ...

  2. 手机端打开调试工具,模拟console.log

    将下列代码考入需要调试页面即可 <script src="//cdn.jsdelivr.net/npm/eruda"></script> <scrip ...

  3. CREATE CONVERSION - 定义一个用户定义的码制转换

    SYNOPSIS CREATE [DEFAULT] CONVERSION name FOR source_encoding TO dest_encoding FROM funcname DESCRIP ...

  4. CAD实现批量打印(网页版)

    主要用到函数说明: IMxDrawPrint::BatchPrintDialog 批量打印对话框,详细说明如下: 参数 说明 [in] IMxDrawResbuf* pParam 批量打印位置参数, ...

  5. must have same number of columns as the referenced primary key

    在使用Hibernate实现多对多的测试过程中遇到了这个问题 解决的方法: 将黄色字段的内容添加进去 <set name="customerSet" table=" ...

  6. 19Web服务

    Web服务 Web服务 Micosoft.Net平台架构中的分布式系统主要包括两部分:用ASP.Net技术构建服务器端动态网页,以及Web服务(Web Service或XML Web Service) ...

  7. 对散列进行sort排序,只是会产生一个顺序,但这顺序和初始化时的顺序不一致

    109 my $slice_layouts;    110 my $vertical_assignment;    111 my %map_function_indices = (    112    ...

  8. Tab键可访问的下拉菜单demo

    <ul id="navigationRegion"> <li token="1" class="index_on"> ...

  9. stark组件之注册与路由系统(三)

    在文章stark组件前戏中已经提到过,django的注册功能是通过AdminSite的单例进行组册的,所以在这里也可以进行单例模式. class AdminSite(object): def __in ...

  10. STM32F407 正点原子 资料网址记录

    网络资源 资源下载: http://www.openedv.com/thread-13912-1-1.html (注意下载资料的版本!非常推荐腾讯视频,因为可以在线免费倍速播放.课件ppt可以单独下载 ...