Beispiel #1
0
 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;
     }
 }
Beispiel #2
0
 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);
 }