Предположим, вы хотите вычислить сумму квадратов разностей предметов:
$ \ sum_ {i = 1} ^ {N-1} (x_i - x_ {i + 1}) ^ 2 $
самый простой код (ввод std::vector<double> xs
, вывод sum2
):
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (prev - (*i)) * (prev - (*i)); // only 1 - with compiler optimization
prev = (*i);
}
Я надеюсь, что компилятор сделает оптимизацию в комментарии выше. Если N
- это длина xs
, у вас есть N-1
умножения и 2N-3
суммы (суммы означают +
или -
).
Теперь предположим, что вы знаете эту переменную:
$ x_1 ^ 2 + x_N ^ 2 + 2 \ sum_ {i = 2} ^ {N-1} x_i ^ 2 $
и назовите его sum
. Расширение биномиального квадрата:
$ sum_i ^ {N-1} (x_i-x_ {i + 1}) ^ 2 = sum
- 2 \ sum_ {i = 1} ^ {N-1} x_i x_ {i + 1} $
поэтому код становится:
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (*i) * prev;
prev = (*i);
}
sum2 = -sum2 * 2. + sum;
Здесь у меня есть N умножений и N-1 сложений . В моем случае N составляет около 100.
Ну, компиляция с g++ -O2
У меня нет ускорения (я пытаюсь вызвать встроенную функцию 2M раз), почему?