Предположим, что у меня есть выражение, образованное целыми переменными и арифметическими операциями: сложение, вычитание и умножение. Я знаю, что каждое умножение занимает M секунд, и каждое добавление/подстановка занимает A секунд. Есть ли алгоритм, который будет вычислять выражение наиболее эффективным способом для произвольного присваивания переменным? (Предположим, что я могу сохранить в памяти только одно число).Алгоритм оптимизации вычисления арифметического выражения
Пример:
М = 10
А = 1
Выражение: а * а + а * Ь + Ь * Ь.
Первоначально он имеет 3 умножений и 2 дополнения, так что общее время составляет 3 * М + 2 * А = 32
Тем не менее, мы можем построить эквивалентное выражение (а + б) * (а + б) -a * b, который имеет только 2 умножения и 3 добавления, поэтому общее время вычисления будет 2 * M + 3 * A = 23.
Следует ли учитывать каждый M и A, используемый при расчете решения? ;) –
Да, каждая стоимость умножения равна M, и каждая добавочная стоимость. Вы не можете повторно использовать полученные результаты. (Предположим, вы используете реверсивную нотацию и вычисляете каждый + или * шаг за шагом). –
Я не уверен, поняли ли вы мой вопрос - например, в вашем примере вы описываете общее время вычисления как «2 * M + 3 * A = 23'. Я спрашиваю, что относительно M и A используется при вычислении вашего решения '2 * M + 3 * A = 23'. Возможно, потребуется еще 3 * M и 15 * A для вычисления решения 23. В этом случае сумма будет равна 23 + 45 ... –