我正在使用c在项目中实现mru(最近使用的)缓存。
我在google上搜索了一些关于mru的概念和实现,与之相反的是lru(最近使用最少的),发现本文http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=626描述了mru集合在c_中的实现。
让我困惑的是,我认为这个实现是LRU而不是MRU有谁能帮我确认这个收藏类是不是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相反,首先丢弃最近使用的项目。
根据我的理解,由于最近访问的节点被移动到列表的前面,如果缓存已满,我们应该删除列表的第一个节点,而不是最后一个节点。

最佳答案

在我看来,这是一个mru实现。请注意,搜索是如何从链接列表的开头开始并返回的,并且无论何时访问节点,都会将其移动到列表的前面。在Add()中,使用AddFirst()添加节点,在TryGetValue()中,删除节点并将其添加到列表的前面。

07-26 09:34