如何实现O(1)查找属于容器的项状态

时间:2013-05-17 13:59:23

标签: c# containers

我有一个容纳很多(数百万)对象的容器,并且必须为每个项目维护一个验证状态,例如:

class MyContainer<T>
{
    bool IsValidated(T t);
}

项目是否经过验证完全是容器的概念。物品没有这样的概念。那么如何在这种情况下实现项目的验证状态呢?我将用我想到的两个解决方案来解释这个问题:

解决方案1)通过强制添加到集合中的项目从基类继承,将Validated属性添加到项目本身:

class MyContainer<T> where T : BaseItem
{
    bool IsValidated(T t)
    {
        return t.IsValidated;
    }
}

class BaseItem
{
    bool IsValidated;
}

但这似乎不对。是否验证项目是容器的关注点。该项目不应具有“已验证”含义的任何概念。但另一方面,这是我能想到的唯一解决方案,给定一个Item,允许在O(1)中查找其验证状态。

解决方案2)在容器中维护字典以将项目与验证状态关联:

class MyContainer<T>
{
    Dictionary<T, bool> isValidated;

    bool IsValidated(T t)
    {
        return isValidated[t];
    }
}

这解决了第一个解决方案的“错误”。它从Item中删除了所有验证知识,也不需要项继承基类。但在坏的方面,确定Item的验证状态的查找现在是O(log n)。

我无法克服的是在设计方面最差的解决方案(#1)在查找性能方面更好。没有什么我能想到的,除了解决方案#1的糟糕设计可以产生O(1)查找。

是否有针对O(1)的精心设计的解决方案,还是应该解决O(log n)查找问题?

1 个答案:

答案 0 :(得分:1)

正如戴夫所写,字典的复杂性接近于O(1)

  

使用密钥检索值非常快,接近O(1),   因为Dictionary类是作为哈希实现的   表

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx