Реализация удаления общих подвыражений

Я изучаю реализацию общего исключения подвыражений (CSE) для графов выражений, соответствующих большим математическим выражениям (миллионы узлов).

Какие алгоритмы подходят для этого? Я искал в Интернете простой в реализации алгоритм, но ничего не нашел. Если возможно, алгоритм должен иметь линейную сложность по количеству узлов полного графа выражения.


person Joel    schedule 04.07.2012    source источник
comment
Это представление может помочь: masonchang.com /блог/2010/8/9/   -  person SK-logic    schedule 04.07.2012


Ответы (1)


Это выражения без побочных эффектов? Тогда проще всего разбить деревья для каждого подвыражения на сегменты, чтобы определить кандидатов на удаление подвыражения. Это особый случай CSE, где все выражения находятся в одном (огромном) "базовом блоке". (Я использую эту идею как основу для обнаружения дубликата кода.)

Если выражения имеют порядок и побочные эффекты, вы можете рассмотреть возможность нумерации значений.

person Ira Baxter    schedule 04.07.2012
comment
Правильно, никаких побочных эффектов. Если я правильно понимаю ваше предложение, я должен перебирать узлы выражения в порядке зависимостей и на каждом этапе проверять, присутствует ли выражение уже в хэш-карте. Если оно присутствует, то вместо этого используйте это подвыражение, если нет, добавьте его в хеш-карту. Это правильно поняли? - person Joel; 04.07.2012
comment
Ага. Порядок зависимостей означает снизу вверх для каждого дерева. - person Ira Baxter; 04.07.2012
comment
Я действительно думал об этой стратегии. Какое хеширование вы бы использовали? - person Joel; 04.07.2012
comment
Не имеет большого значения. Вам нужна хэш-функция, которая равномерно отображает большинство деревьев по ячейкам. Если вы можете создать необработанную хеш-функцию (что-то, что производит 32 или 64-битное хеш-значение) на одном листовом узле, вы можете составить хэши из дочерних элементов, чтобы получить родительский хэш-код, просто добавив/сократив хэши дочерних элементов. Тогда хеш-код — это просто хэш-значение по модулю количества сегментов в вашей хэш-карте. - person Ira Baxter; 04.07.2012
comment
ХОРОШО. Я попробую это тогда. Спасибо! - person Joel; 05.07.2012