алгоритм сохранения состояний для динамического программирования

Вот вопрос по поводу сохранения состояний в задаче с использованием динамического программирования.

  • Каждая проблема DP сохраняет результаты и использует их в дальнейшем для сокращения вычислений. Скажем, мы вычисляем значение функции f(x,y)=290 и сохраняем его в двумерном массиве $save, так что $save[x][y]=290. Это можно сделать, когда 'f' зависит только от небольшого количества переменных (например, только от 2 переменных x и y в приведенном выше примере). Но что можно сделать, когда 'f' зависит, скажем, от 10 или 15 переменных. Создание массива из 10 или 15 измерений не будет эффективным с точки зрения использования памяти.

  • Другое решение может заключаться в том, что мы объединяем значения переменных (при условии, что они уникальны) и сохраняем их в ассоциативном массиве, используя полученную в результате объединения строку в качестве ключа. Но объединение — это трудоемкая операция. Итак, у нас есть компромисс между памятью и временем.

Есть ли способ сохранить состояния, если существует большее количество переменных, от которых зависит состояние? Я думаю, что может быть какой-то способ использования OOPS или указателей, но я не совсем могу что-либо обрамить. Какие-либо предложения? Любая идея приветствуется, но предпочтительны решения, касающиеся 'C' или 'PHP'. Я знаю, что "C" не работает с ассоциативными массивами, но мне просто нужен алгоритм/способ сохранения состояний.


person halkujabra    schedule 02.10.2012    source источник
comment
Эм, используя map:Tuple->Value ? Однако, если вы собираетесь вычислять ВСЕ возможные входные данные (x_1,x_2,..x_k) до некоторого предела, многомерный массив, вероятно, является лучшим решением (более быстрый доступ, чем map, и вы все равно собираетесь заполнить карту, если вы рассчитать все/большинство значений).   -  person amit    schedule 02.10.2012
comment
Вы должны переформатировать этот вопрос, чтобы сделать его более читабельным. Без абзацев и кучи жирного текста действительно трудно читать.   -  person verdesmarald    schedule 02.10.2012
comment
@amit Я пытался сделать это с 10-мерным массивом для k = 10, но для этого требуется очень много памяти. Можете ли вы предложить лучшее решение?   -  person halkujabra    schedule 02.10.2012
comment
@verdesmarald Я сделал это. Спасибо.   -  person halkujabra    schedule 02.10.2012
comment
Использовать хэш переменных в качестве ключа и хранить функции и переменные в таблицах 1: n?   -  person JvdBerg    schedule 02.10.2012
comment
@JvdBerg Не могли бы вы немного уточнить?   -  person halkujabra    schedule 02.10.2012


Ответы (1)


  1. Сохранение состояний в разреженных данных обычно выполняется с помощью интерфейса map (Associative Array). Хотя C не имеет его встроенного - в Интернете полно библиотек, которые предлагают эту функциональность.

  2. Если вы все равно собираетесь вычислять большинство/все (x1,...,xk) значения - использование map не рекомендуется - это будет медленнее и не будет экономить память (на самом деле в этих случаях наоборот) . Если это так, то многомерный массив, вероятно, является лучшим решением.

  3. Много раз в DP вам не нужен массив всей информации на данный момент, а только ранее рассчитанная «строка» и переопределение массива. Эффективно - для многих задач DP, требующих таблиц k * N, вам на самом деле нужны только таблицы размером 2 * N, и итеративно переопределять одни и те же строки. Я считаю, что тот же принцип может применяться для любого измерения - если все, что вам нужно, это данные из предыдущей строки, а не все данные.

person amit    schedule 02.10.2012
comment
вы имеете в виду, сохранить в многомерном массиве и итеративно переопределить? - person halkujabra; 02.10.2012
comment
@ user1708762: Точно - это обычная оптимизация в алгоритмах DP, которая всегда требует только последней строки, а не всех вычисленных до сих пор строк. - person amit; 02.10.2012
comment
благодаря. Кстати, эта оптимизация предназначена только для подходов «снизу вверх» или также для подходов «сверху вниз»? - person halkujabra; 02.10.2012
comment
@user1708762: user1708762: Я никогда не видел этого в подходах сверху вниз и не могу придумать сценарий, в котором он будет работать сверху вниз. Тем не менее, он идеально подходит для многих алгоритмов, таких как LCS. - person amit; 02.10.2012
comment
спасибо за Ваш ответ. Не могли бы вы ответить на другой вопрос, заданный мной? « title = «минимальная сумма, необходимая для преобразования некоторых целых чисел в ноль»> stackoverflow.com/questions/12655593/ - person halkujabra; 02.10.2012