有一个函数可以获得数组中每个period
- 长度间隔的最大值。
void f(const std::vector<double> &v, std::vector<double> &vv, size_t period)
{
vv.resize(v.size());
for (size_t i = period; i <= v.size(); ++i) {
vv[i - 1] = *std::max_element(v.begin() + i - period, v.begin() + i);
}
}
如何通过性能优化此功能?
答案 0 :(得分:0)
您可以检查前面计算的最大值是否与前一个范围的第一个值一致:如果不是,则新的最大值变为新间隔的旧最大位置和最后一个位置之间的std::max
。
某事(警告:代码未经测试)
void f(const std::vector<double> &v, std::vector<double> &vv, size_t period)
{
vv.resize(v.size());
bool oldMaxFirst = false;
for (size_t i = period; i <= v.size(); ++i) {
if ( oldMaxFirst )
vv[i - 1] = std::max(vv[i - 2], v[i - 1]);
else
vv[i - 1] = *std::max_element(v.begin() + i - period, v.begin() + i);
oldMaxFirst = vv[i - 1] == v[i - period];
}
}
或者(但代码变得有点混淆)
void f(const std::vector<double> &v, std::vector<double> &vv, size_t period)
{
vv.resize(v.size());
bool oldMaxFirst = false;
for (size_t i = period; i <= v.size(); ++i) {
oldMaxFirst = v[i - period] == (vv[i - 1] = (oldMaxFirst
? std::max(vv[i - 2], v[i - 1])
: *std::max_element(v.begin() + i - period, v.begin() + i) ); }
}