C# を使用してプロジェクトに MRU (最近使用した) キャッシュを実装する作業を行っています。
MRU とその反対である LRU (最近使用されていない) に関するいくつかの概念と実装をグーグルで調べたところ、次の記事を見つけましたhttp://www.informit.com/guides/content.aspx?g=dotnet&seqNum=626の実装について説明していますC# での MRU コレクション。
私を混乱させるのは、この実装が MRU ではなく LRU だと思うことです。このコレクション クラスが MRU であるかどうかを確認するのを手伝ってくれる人はいますか?
次のコード ブロックは、MRUCollection クラス全体です。ありがとう。
class MruDictionary<TKey, TValue>
{
private LinkedList<MruItem> items;
private Dictionary<TKey, LinkedListNode<MruItem>> itemIndex;
private int maxCapacity;
public MruDictionary(int cap)
{
maxCapacity = cap;
items = new LinkedList<MruItem>();
itemIndex = new Dictionary<TKey, LinkedListNode<MruItem>>(maxCapacity);
}
public void Add(TKey key, TValue value)
{
if (itemIndex.ContainsKey(key))
{
throw new ArgumentException("An item with the same key already exists.");
}
if (itemIndex.Count == maxCapacity)
{
LinkedListNode<MruItem> node = items.Last;
items.RemoveLast(); //Why do we move the last than first here? The node accessed recently is moved to the front of list.
itemIndex.Remove(node.Value.Key);
}
LinkedListNode<MruItem> newNode = new LinkedListNode<MruItem>(new MruItem(key, value));
items.AddFirst(newNode);
itemIndex.Add(key, newNode);
}
public bool TryGetValue(TKey key, out TValue value)
{
LinkedListNode<MruItem> node;
if (itemIndex.TryGetValue(key, out node))
{
value = node.Value.Value;
items.Remove(node);
items.AddFirst(node);
return true;
}
value = default(TValue);
return false;
}
}
class MruItem
{
private TKey _key;
private TValue _value;
public MruItem(TKey k, TValue v)
{
_key = key;
_value = v;
}
public TKey Key
{
get { return _key; }
}
public TValue Value
{
get { return _value; }
}
}
http://en.wikipedia.org/wiki/Cache_algorithms#Most_Recently_Used
最近使用した (MRU): LRU とは対照的に、最近使用したアイテムを最初に破棄します。
私の理解では、最近アクセスしたノードがリストの先頭に移動されるため、キャッシュがいっぱいの場合は、リストの最後ではなく最初のノードを削除する必要があります。