Это считается воспоминанием? - PullRequest
1 голос
/ 22 марта 2011

При оптимизации какого-то кода в последнее время мы в итоге выполнили то, что я считаю «типом» запоминания, но я не уверен, что нам следует так его называть. Приведенный ниже псевдокод не является алгоритмом фактического (поскольку в нашем приложении мы не нуждаемся в факториалах, а публикация указанного кода является увольнением), но его должно быть достаточно для объяснения моего вопроса. Это был оригинал:

def factorial (n):
    if n == 1 return 1
    return n * factorial (n-1)

Достаточно просто, но мы добавили фиксированные точки, чтобы можно было избегать большого количества вычислений для больших чисел, например:

def factorial (n):
    if n == 1 return 1
    if n == 10 return 3628800
    if n == 20 return 2432902008176640000
    if n == 30 return 265252859812191058636308480000000
    if n == 40 return 815915283247897734345611269596115894272000000000
    # And so on.

    return n * factorial (n-1)

Это, конечно, означало, что 12! было рассчитано как 12 * 11 * 3628800, а не как менее эффективное 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.

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

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

Ответы [ 3 ]

4 голосов
/ 22 марта 2011

Я бы назвал это предварительным расчетом, а не запоминанием. Вы на самом деле не помните какие-либо вычисления, которые вы делали в процессе вычисления окончательного ответа для заданного ввода, скорее, вы предварительно рассчитываете некоторое фиксированное количество ответов для конкретных входных данных. Заметка, насколько я понимаю, действительно больше похожа на «кэширование» набора результатов, когда вы рассчитываете их для последующего повторного использования. Если бы вам нужно было хранить каждое значение, рассчитанное таким образом, чтобы вам не нужно было снова пересчитывать его позже, это было бы запоминанием. Ваше решение отличается тем, что вы никогда не сохраняете «рассчитанные» результаты из вашей программы, только фиксированные точки, которые были предварительно рассчитаны. В случае напоминания, если вы перезапустите функцию с вводом, отличным от одного из предварительно рассчитанных, ей не нужно будет пересчитывать результат, он просто повторно использует ее.

1 голос
/ 22 марта 2011

Запоминание выполняется во время выполнения. Вы оптимизируете во время компиляции. Так что это не так.

См. Например ... Википедия

Или ...

  1. запоминание Термин «запоминание» был придуман Дональдом Мичи (1968) для обозначения процесса, с помощью которого функция автоматически запоминает результаты предыдущих вычислений. Идея стала более популярной в последние годы с ростом функциональных языков; Филд и Харрисон (1988) посвящают ему целую главу. Основная идея состоит в том, чтобы просто сохранить таблицу предварительно вычисленных пар ввода / результата.

Питер Норвиг Калифорнийский университет (жирный шрифт мой)

Ссылка

1 голос
/ 22 марта 2011

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

...