lfuCache:
map
minheap
n
ctor(n):
if n < 0:
throw
n = n
map = new map(capacity: n)
minheap = new minheap(n, item => item.frequency)
value get(key):
if key == null: throw
// do not throw if key no exists
if !has(key):
return null // default(value)
item = map[key]
item.frequency++ // possible overflow
minheap.heapify()
return item.value
add(key, value):
if key == null: throw
if has(key):
item = map[key]
item.value = value
item.frequency = 0
minheap.heapify()
return
item = {key, value, frequency: 0} // deleted item have -1 frequency
if isfull():
lfuitem = minheap.displace(item)
else:
minheap.push(item)
map[key] = item
bool delete(key):
if key == null: throw
// do not throw if key no exists
if !has(key):
return false
item = map[key]
item.frequency = -1 // new items have 0 frequency
minheap.heapify()
minheap.pop()
map.removeKey(k)
return true
bool has(key):
if key == null: throw
return map.haskey(key)
int count():
return minheap.count()
int isfull():
return count() == n
// heapify x by keySelector
minheap:
ctor(n, keySelector):
n = n
keySelector = keySelector
push(x):
x pop():
// uses siftdown
heapify():
// returns top, replacing with x, heapify
x displace(x):
int count():
item:
value
frequency // unsigned to reduce overflow chance
Friday, October 06, 2017
lfu cache of n items
lfu cache with O(logn) get, add, delete.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment