查找可能不返回任何结果的最佳匹配的算法

algorithm to find best match that may return none

本文关键字:最佳 算法 结果 任何 返回 查找      更新时间:2023-10-16

我有一些输入可能暂时不可用,并且有一个相关的错误。

struct sensorVal
{
    bool available;
    double error;
    double val;
    bool betterThan(const sensorVal* that) const;
}

我正在寻找一个算法,将找到最好的可用的输入。到目前为止,我最好的尝试是使用min_element如下:

bool sensorVal::betterThan(const sensorVal& that) const
{
    if (available)
    {
        if (that.available)
            return (error < that.error);
        return true;
    }
    return false;
}
bool betterThan(const sensorVal& lhs, const sensorVal& rhs)
{
    return lhs.betterThan(rhs);
}
std::vector<sensorVal>::const_iterator 
find_best(const std::vector<sensorVal>& inputs)
{
    std::vector<sensorVal>::const_iterator best;
    best = min_element(inputs.begin(), inputs.end(), betterThan);
    if (best->available)
        return best;
    return inputs.end();
}

除了所有输入都被标记为不可用之外,这很好地工作。在本例中,best设置为inputs.begin(),然后我需要测试它是否可用。

我希望最好设置为inputs.end(),这在我的代码中已经满足了。

是否存在一种算法可以找到最佳匹配,并且可以返回没有合适的成员?或者重新定义我的测试,以便将best设置为inputs.end()

谢谢

也许你只是想让它看起来更好一点?

best = min_element(inputs.begin(), inputs.end(), betterThan);
return best->available ? best : inputs.end();

您可以使用std::accumulate代替,但我认为您已有的解决方案更好。

struct best {
  std::vector<sensorVal>::const_iterator end;
  explicit best(std::vector<sensorVal>::const_iterator end) : end(end){}
  std::vector<sensorVal>::const_iterator operator()(std::vector<sensorVal>::const_iterator l, std::vector<sensorVal>::const_iterator r) {
    return (r->available() && (l == end() || r->error < l->error)) ? r : l
  }
};
std::vector<sensorVal>::const_iterator 
find_best(const std::vector<sensorVal>& inputs)
{
  return std::accumulate(inputs.begin(), inputs.end(), inputs.end(), best(inputs.end());
}

也许您可以使用std::partition()将向量分类为可用和不可用的输入。然后使用min_element在可用子集中查找最佳。