Я ищу алгоритм, который оптимизирует порядок оценок в DAG, так что используется наименьшая память. Это может быть немного сложнее объяснить, поэтому я приведу пример, что я имею в виду. Учтите, что у вас есть DAG с несколькими корнями, что представляет собой некоторую форму порядка оценки зависимостей. Поэтому каждый ребенок node может выполнять свое действие только после того, как его родители выполнили. Кроме того, мы можем освободить из памяти каждый node, который нам больше не нужен. Задача состоит в том, чтобы найти оптимальный последовательный график оценки, чтобы наименьшая память использовалась в любое время. Например, рассмотрим приведенный ниже график:
И два графика:
load A - 1 node in memory
load B - 2
eval C - 3
eval D - 4
eval F - 5
unload C - 4
eval H - 5
unload A,F - 3
eval E - 4
eval G - 5
unload D,E - 3
eval I - 4
unload B,G - 2
eval J - 3
unload H,I
Maximum memory trace - 5
И этот:
load A - 1 node in memory
load B - 2
eval C - 3
eval D - 4
eval E - 5
eval F - 6
unload C - 5
eval G - 6
unload D,E - 4
eval H - 5
unload A,F - 3
eval I - 4
unload B,G - 2
eval J - 3
unload H,I - 1
unload C - 4
eval H - 5
unload A,F - 3
eval E - 4
eval G - 5
unload D,E - 3
eval I - 4
unload B,G - 2
eval J - 3
unload H,I
Maximum memory trace - 6
Предполагая, что все узлы занимают одну и ту же память, есть ли алгоритм, который делает это оптимально? Первый из них похож на первый шаг по глубине, а второй - как обход первого дыхания, но я не знаю, оптимальны ли они и почему.
PS:
Просто, чтобы уточнить, как отметил в своем комментарии @Evgeny Kluev, это очень похоже на Register Allocation, которое можно эффективно решить с помощью эвристических алгоритмов алгоритма грациозного графа. Однако распределение регистров является более простой проблемой, поскольку предполагает, что вы знаете порядок вычислений и, следовательно, можете рассчитать жизнеспособность каждой переменной. После этого вы можете легко построить граф вывода и выполнить раскраску графика. В нашем случае мы хотим, чтобы , а также оптимизировали порядок вычислений. Это, конечно, требует некоторых предположений, например, что у нас нет указателей и только базовые структуры данных (что и представляют мои узлы). Очевидно, что поскольку раскраска графа NP-полная, эта проблема по крайней мере NP-полная. То, что я ищу, - это какой-то алчный/эвристический алгоритм, который дает хорошее решение для некоторых не слишком дегенеративных случаев.