public void Put(int key, int value) { if (_capacity < 1) { return; } if (_keyCache.TryGetValue(key, out var v)) { v.Value = value; SetFreq(v, true); } else { if (_capacity == _keyCache.Count) { var list = _freCache[_minFreq]; var r = list[0]; list.RemoveAt(0); _keyCache.Remove(r.Key); } var item = new LFUItem { Freq = 1, Key = key, Value = value }; _keyCache[key] = item; SetFreq(item, false); _minFreq = 1; } }
private void SetFreq(LFUItem v, bool removeOld) { if (removeOld) { var oldList = _freCache[v.Freq]; oldList.Remove(v); if (v.Freq == _minFreq && oldList.Count == 0) { _minFreq++; } v.Freq++; } if (!_freCache.TryGetValue(v.Freq, out var newList)) { newList = new List <LFUItem>(); _freCache[v.Freq] = newList; } newList.Add(v); }