标签:
转自:http://hihocoder.com/discuss/question/2154/
今天在hiho上看到一个题目,要求模拟浏览器的URL请求过程,有n个请求,本地有一个容量为m的cache。当浏览器请求URL时,先在cache里面查找,如果没有,从服务器请求,并把内容存入cache中。如果cache满了,则删除最早访问的内容。
朴素的做法是o(n * m)。
o(n * log(m))做法:
cache中的查找可以用一个堆或者二叉树实现,复杂度是log(n)。
删除最早的访问记录,可以用一个数组记录访问顺序。
具体:访问内容为
abc->123 vis[a]=1, vis[b]=2, vis[c] = 3, h = 1, t = 3
abcd->1234 vis[a] = 1, vis[b] = 2, vis[c] = 3, vis[d] = 4, h = 2, t = 4, 从map中删除a
abcdb->12345 vis[a] = 1, vis[b] = 5, vis[c] = 3, vis[d] = 4, h = 3, t = 5 因为vis[a[2]] != 2,说明2不是最新的b的位置跳过b
abcdba->123456 vis[a] = 6, vis[b] = 5, vis[c] = 3, vis[d] = 4, h = 4, t = 6 从map中删除c
代码:
s = 1 For i = 1..n If (lastVisit[ a[i] ] in [s,i]) Print "Cache" Else cacheCnt = cacheCnt + 1; If (cacheCnt > m) // 缓存已满 s = s + 1 // 将该a[s]从cache中抛弃 End If Print "Internet" End lastVisit[ a[i] ] = i // 更新最后一次访问时间 While (lastVisit[ a[s] ] != s) s = s + 1 End While // 更新s找到新的最早的访问记录 End For
标签:
原文地址:http://www.cnblogs.com/ywys/p/4790146.html