我有一个容纳很多(数百万)对象的容器,并且必须为每个项目维护一个验证状态,例如:
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)查找问题?
答案 0 :(得分:1)
正如戴夫所写,字典的复杂性接近于O(1)
使用密钥检索值非常快,接近O(1), 因为Dictionary类是作为哈希实现的 表