我有一个包含很多(数百万)对象的容器,并且必须为每个项目维护一个经过验证的状态,例如:
class MyContainer<T>
{
bool IsValidated(T t);
}
一个项目是否被验证完全是一个容器的概念。物品没有这样的概念。那么这种情况下如何实现item的Validated状态呢?我将用我想到的两种解决方案来解释这个问题:
解决方案 1)通过强制添加到集合中的项目从基类继承来为项目本身添加一个 Validated 属性:
class MyContainer<T> where T : BaseItem
{
bool IsValidated(T t)
{
return t.IsValidated;
}
}
class BaseItem
{
bool IsValidated;
}
但这似乎是错误的。一个项目是否被验证是容器的关注点。该项目不应该对“已验证”的含义有任何概念。但另一方面,这是我能想到的唯一解决方案,给定一个项目,允许在 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) 查找?