如何实现0(1)查找属于容器的项目状态
本文关键字:项目 状态 属于 何实现 实现 查找 | 更新日期: 2023-09-27 18:14:00
我有一个容器,其中包含大量(数百万)对象,并且必须为每个项目维护一个已验证的状态,例如:
class MyContainer<T>
{
bool IsValidated(T t);
}
项是否被验证完全是容器的概念。物品没有这样的概念。那么在这种情况下,如何实现项目的Validated状态呢?我将用我想到的两个解决方案来解释这个问题:
解决方案1)通过强制添加到集合中的项从基类继承,为项本身添加一个Validated属性:
class MyContainer<T> where T : BaseItem
{
bool IsValidated(T t)
{
return t.IsValidated;
}
}
class BaseItem
{
bool IsValidated;
}
但这似乎是错误的。项是否被验证是容器关心的问题。该条目不应该有任何关于"验证"的概念。但另一方面,这是我能想到的唯一解决方案,给定一个Item,允许在O(1)中查找其验证状态。
解决方案2)在容器中维护一个字典,将Items与验证状态关联起来:
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)查找?
正如Dave所写,字典的复杂度接近于0 (1)
http://msdn.microsoft.com/en-us/library/xfhwa508.aspx通过键来检索值非常快,接近0(1)。因为Dictionary类是作为散列实现的表。