Implement core data structures and rate-limited services with clear APIs and invariants
Compose standard structures (hash maps, lists, heaps) to meet API constraints (time/space).
Use for cache designs, randomized O(1) sets, and token buckets/leaky buckets for rate limiting.
Evict by recency/frequency
class LRUCache:
def __init__(self, capacity):
self.cap=capacity; self.map={}; self.head=[0,0]; self.tail=[0,0]; self.head[1]=self.tail; self.tail[0]=self.head
def _remove(self, node): node[0][1]=node[1]; node[1][0]=node[0]
def _add_front(self, node): node[1]=self.head[1]; node[0]=self.head; self.head[1][0]=node; self.head[1]=node
def get(self, k):
if k not in self.map: return -1
n=self.map[k]; self._remove(n); self._add_front(n); return n[2]
def put(self, k, v):
if k in self.map: n=self.map[k]; n[2]=v; self._remove(n); self._add_front(n); return
n=[None,None,v]; self.map[k]=n; self._add_front(n)
if len(self.map)>self.cap: lru=self.tail[0]; self._remove(lru); del self.map[next(k for k,val in self.map.items() if val is lru)]
Token bucket/leaky bucket
# Token bucket
class TokenBucket:
def __init__(self, rate, burst): self.rate=rate; self.burst=burst; self.tokens=burst; self.last=0
def allow(self, now):
self.tokens=min(self.burst, self.tokens + (now-self.last)*self.rate); self.last=now
if self.tokens>=1: self.tokens-=1; return True
return False
Array + map for O(1)
import random
class RandomizedSet:
def __init__(self): self.a=[]; self.pos={}
def insert(self, val):
if val in self.pos: return False
self.pos[val]=len(self.a); self.a.append(val); return True
def remove(self, val):
if val not in self.pos: return False
i=self.pos.pop(val); last=self.a.pop()
if i<len(self.a): self.pos[last]=i; self.a[i]=last
return True
def getRandom(self): return random.choice(self.a)
def template(*args, **kwargs):
# General template placeholder
pass
Hash map + list/heap give constant-time ops.
Store n items + metadata.