|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Maxim Plaksin 2:468/57.113 12 Jul 2001 02:38:37 To : Oleg Ponomarev Subject : Скобки расставить. Оптимальное вычисление выражения с несколькими п --------------------------------------------------------------------------------
Однажды 16 Aug 37 в 18:24, Oleg Ponomarev писал к All:
OP> Hапример:
OP> 1 + x1*x2*x3 + x1*x2*x4 (6 умножений)
OP> легко преобразуется в
OP> 1 + x1*x2 * (x3 + x4) (3 умножения)
судя по этому примеру, алгоритм можно представить как рекурсию:
описываю образно, думаю сам додумаешь как это формализовать, т.к. особо
напрягаться летом неохота.
в начале, представляем выражение в виде структуры, в которой, каждой группе
множителей Xq,Xw,Xe...Xr ставим в соответствие запись, в которой содержатся
индексы всех иксов, т.е. получится нечто такое: <q,w,e,...r> теперь наша задача
сводится к тому, что бы брать попарно две таких записи, находить в них
одинаковые индексы и "выносить их за скобки", а что бы это получилось как можно
оптимальнее, нам на помощь приходит рекурсия:
суть рекурсии в данном случае будет заключаться в переборе всех возможных
комбинаций "вынесения" общих множетелей и нахождение самого короткого выражения
(в данном случае, как я понял, главным критерием является колличество умножений
в выражении)
насчет структуры я пошутил :) там нужно нечто более мудреное, т.к. кроме
индексов, надо запоминать еще что у нас после вынесения множителей получилось в
скобках и кроме этого, сами скобки так же могут быть общими множителями, но не
пугайся - внимательно представь себе эти преобразования и ты обязательно
найдешь закономерности, которые и будут нужным алгоритмом.
прямо перед отправкой мне в голову пришла мысль:
когда после вынесения общего множителя получаем скобки, их можно обозначить
введением новой переменной, а ее соответствие этим скобкам запомнить где-то в
памяти (и каждый раз, после вынесения общего множителя, проверять - а нет-ли
у нас уже соответствующей подстановки?), тогда алгоритм упрощается. после того,
как получится выражение, не подлежащее дальнейшей оптимизации, к нему применить
обратное действие - подставить вместо введенных переменных соответствующие им
скобки, после чего пересчитать к-во умножений и зделать вывод об оптимальности
результата.
OP> В моем случае количество переменных может достигать 70-ти,
OP> а количество комбинаций их различных произведений нескольких тясяч.
вариантов перебора будет _очень_ много, но в итоге ты получишь наиболее
оптимальное произведение
OP> Hаверняка, в компиляторах применяется некие приемы оптимизации
OP> вычисления выражений. Какие? Что лучше применить мне в моем случае?
если в _итоге_ ничего не получится - напиши мне мылом, я попробую тогда сам
написать программу...
bYe..
---
* Origin: Люблю экстрeмальный спорт - серфинг в net-mail'e... (2:468/57.113)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.algorithms/160783b4d0ea0.html, оценка из 5, голосов 10
|