Уменьшите количество операций на простом выражении
Предположим, что я беру вычисление, которое включает только добавление и умножение:
(a+b)*(c+d)
который может быть выполнен многими другими способами, например.
a*(c+d) + b*(c+d)
a*c + a*d + b*c + b*d
В терминах добавлений и умножений число операций, необходимых для каждого из трех приведенных примеров, равно (2,1) (3,2) (3,4) соответственно. Ясно, что если цель состоит в том, чтобы сократить общее количество операций, то первое преимущество. Есть ли способ, с помощью произвольного выражения найти порядок вычислений, который требует наименьшего числа операций?
Примечание: Этот вопрос повторно запрашивается у SE.math для понимания и перспективы толпы CS.
Ответы
Ответ 1
Вы хотите эффективно генерировать все возможные эквивалентные алгебраические выражения и выбирать ту, которая занимает наименее дорогостоящее количество шагов (добавление X три раза дешевле на большинстве машин, чем умножение X на 3).
Неправильно это делать, так как число "эквивалентных" формул бесконечно.
Однако Пелегри-Ллоплат разработал схему генерации оптимального кода с учетом фиксированного числа правил алгебраической перезаписи, называемого "BURS" (восходящая система восходящего восхождения ). Это было реализовано в некоторых генераторах кода.
В сущности, он строит автономные большие автоматы, чьи состояния отслеживают набор возможных примененных переписаний. Каждое государство знает, что генерировать, когда это происходит, поэтому онлайн-время для генерации кода дешево.
Ответ 2
Игнорируя полномочия переменных и целочисленные коэффициенты, это сводится к проблеме , правильно?
Ответ 3
Для эффективной оценки многочленов в одночленной форме существует правило Horner. В соответствии с этим, учитывая многочлен степени n
p (x) = a n x n + a n-1 x n-1 +... + a 1 x 1 + a 0
Требуется только n умножений (не n + (n-1) + (n-2) +... + 1 = n (n + 1)/2, как это может показаться с первого взгляда). Это потому, что полином можно переписать как
p (x) = ((a n x + a n-1) x + a n-2) x +... a 1) x + a 0
Ответ 4
Одна идея - рассмотрим переменные как логические значения и запишем форму maxterm
текст ссылки
Ответ 5
Не уверен в общем случае, но похоже, что многочлены факторинга улучшают производительность. Пример из удаленного курса comp sci:
a * x^2 + b * x + c
улучшается путем разложения x:
x * (a * x + b) + c