我正在寻找一种方法来帮助我以非常有效的方式快速查找某种表结构中的重复条目。这是我的问题:
我有Cargo
类型的对象,其中每个Cargo
都有一个其他关联Cargo
的列表。每种货物也有与之相关的类型。
所以例如:
class Cargo {
int cargoType;
std::list<Cargo*> associated;
}
现在,对于每个货物对象及其相关货物,根据其类型分配给它一定的值。此评估由实现CargoEvaluator
的类进行。
现在,我有一个CargoEvaluatorManager
,基本上可以将所有内容连接在一起。 CargoEvaluators
已在CargoEvaluatorManager
注册,然后,为了评估货物,我致电CargoEvaluatorManager.EvaluateCargo(Cargo* cargo)
。
这是当前状态
class CargoEvaluatorManager{
std::vector<std::vector<CargoEvaluator*>> evaluators;
double EvaluateCargo(Cargo* cargo)
{
double value = 0.0;
for(auto& associated : cargo->associated) {
auto evaluator = evaluators[cargo->cargoType][associated->cargoType];
if(evaluator != nullptr)
value += evaluator->Evaluate(cargo, associated);
}
return value;
}
}
所以回顾并提一些额外的观点:
CargoEvaluatorManager
使用货物类型作为索引将CargoEvaluators
存储在二维数组中。用nullptrs初始化整个2d向量。当注册CargoEvaluator
时,调整阵列大小以及我未在此处显示的其他位和内容将得到适当处理。
我曾尝试使用带有std :: pair的地图作为查找不同评估者的关键,但速度太慢了。
这只允许CargoEvaluator
的每个组合cargotype
一个EvaluateCargo
。我希望有多个货物评估员。
我称之为Evaluators
数十亿次。我知道我目前的实施并不是最有效的,我正在寻找替代方案。
我在寻找什么
如上所述,除了我想为每对Cargo
类型允许多个--------------------------------------------
|int type 1 | int type 2 | CaroEvaluator* |
|------------------------------------------|
| 5 | 7 | Eval1* |
| 5 | 7 | Eval2* |
| 4 | 6 | Eval3* |
--------------------------------------------
之外,我想做我已经概述的大部分内容。正如我想象的那样,天真地,是这样的表:
(5,7)
查找应该是对称的,因为集合(7,5)
和Caro
应解析为相同的条目。为了速度,我不介意预加载重复的条目。
列表中的关联Evaluators
可能比penalty
多3倍或更多,如果这会影响到事物。
如上所述,性能至关重要!
对于奖励积分,每个货物评估员可能会有一个与之相关的额外Associates
值,而不取决于Cargo
个{{1} }} 具有。换句话说:如果查找上表中的一行,我想每次调用double Evaluator->AddPenality()
一次,只需调用EvaluateCargo
。我无法存储任何实例变量,因为它会导致一些多线程问题。
一个额外的限制因素是我需要能够识别与特定CargoEvaluators
相关联的cargotype
,这意味着将两种车型混合在一起并不是一个可行的选择。
如果需要进一步澄清,我很乐意尝试提供帮助。
提前谢谢大家!