Optimization 这算是回忆录吗?
最近在优化一些代码时,我们最终执行了我认为是“类型”的回忆录,但我不确定我们是否应该这样称呼它。下面的伪代码不是实际的算法(因为我们在应用程序中几乎不需要阶乘,发布所述代码是一种冒犯),但它应该足以解释我的问题。这是原作:Optimization 这算是回忆录吗?,optimization,naming,memoization,Optimization,Naming,Memoization,最近在优化一些代码时,我们最终执行了我认为是“类型”的回忆录,但我不确定我们是否应该这样称呼它。下面的伪代码不是实际的算法(因为我们在应用程序中几乎不需要阶乘,发布所述代码是一种冒犯),但它应该足以解释我的问题。这是原作: def factorial (n): if n == 1 return 1 return n * factorial (n-1) 很简单,但我们添加了固定点,这样就可以避免对较大的数字进行大量计算,例如: def factorial (n): if
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
但我想知道我们是否应该称之为记忆,因为它似乎被定义为记住过去的计算结果并使用它们。这更多的是关于硬编码计算(不记得)和使用这些信息
这个过程有一个合适的名字吗?或者我们可以说,记忆不仅可以追溯到运行时完成的计算,还可以追溯到编译时完成的计算,甚至可以追溯到我开始编写代码之前在脑海中完成的计算?无论您是否在硬编码结果,这仍然是备忘录,因为您已经计算了预期要再次计算的结果。现在这可能以运行时或编译时的形式出现。。但无论哪种方式,它都是记忆。无论您是否对结果进行硬编码,这仍然是记忆,因为您已经计算了结果,希望再次计算。现在这可能以运行时或编译时的形式出现。。但无论哪种方式,它都是内存化。内存化是在运行时完成的。您正在编译时进行优化。所以,事实并非如此
例如,见
或者
回忆录
“记忆化”一词由唐纳德·米奇(Donald Michie,1968年)发明,是指一个函数自动记忆先前计算结果的过程。近年来,随着函数式语言的兴起,这种思想变得越来越流行;菲尔德和哈里森(1988)用了整整一章来论述它。其基本思想就是保留一个包含先前计算的输入/结果对的表李>
彼得·诺维格
加利福尼亚大学
(黑体字是我的)
记录在运行时完成。您正在编译时进行优化。所以,事实并非如此
例如,见
或者
回忆录
“记忆化”一词由唐纳德·米奇(Donald Michie,1968年)发明,是指一个函数自动记忆先前计算结果的过程。近年来,随着函数式语言的兴起,这种思想变得越来越流行;菲尔德和哈里森(1988)用了整整一章来论述它。其基本思想就是保留一个包含先前计算的输入/结果对的表李>
彼得·诺维格
加利福尼亚大学
(黑体字是我的)
我称之为预计算,而不是记忆。在计算给定输入的最终答案的过程中,您并没有真正记住您所做的任何计算,而是为特定输入预先计算了一些固定数量的答案。据我所知,记忆实际上更类似于在计算一组结果以供以后重用时“缓存”它们。如果要存储每个计算出的值,这样以后就不需要重新计算,那么这就是记忆。您的解决方案的不同之处在于,您从不存储程序中的任何“计算”结果,只存储预先计算的固定点。有了记忆功能,如果重新运行函数时输入的输入与预先计算的输入不同,则不必重新计算结果,只需重复使用即可。我称之为预先计算,而不是记忆功能。在计算给定输入的最终答案的过程中,您并没有真正记住您所做的任何计算,而是为特定输入预先计算了一些固定数量的答案。据我所知,记忆实际上更类似于在计算一组结果以供以后重用时“缓存”它们。如果要存储每个计算出的值,这样以后就不需要重新计算,那么这就是记忆。您的解决方案的不同之处在于,您从不存储程序中的任何“计算”结果,只存储预先计算的固定点。使用Memorization,如果重新运行函数时输入的输入与预先计算的输入不同,则不必重新计算结果,只需重复使用即可。是。这是一种回忆录。你还需要知道什么?这就是我需要知道的。它与Wikipedia条目不一致,Wikipedia条目明确指出:一个记忆函数“记住”与某组特定输入对应的结果。具有记住的输入的后续调用将返回记住的结果,而不是重新计算它,…
。我想可能会有一个不同的术语来表示它不记得,而是硬编码的情况。好吧,到目前为止,我有两个答案,是和否。这意味着可能需要引用权威来源。我会把这个问题留几个小时,看看会有什么结果。“可能需要权威来源”?真正地为什么这是正确的记忆,接近记忆,不是真正的记忆,或者根本不是记忆,这很重要?你的民意调查结果是否会带来金钱?这很重要,因为我们都应该想用正确的术语来描述我们正在讨论的问题。对于想知道气泡排序是否可以称为快速s的人来说,这没有什么不同
def memoisation(f):
dct = {}
def myfunction(x):
if x not in dct:
dct[x] = f(x)
return dct[x]
return myfunction
@memoisation
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
def nb_appels(n):
if n==0 or n==1:
return 0
else:
return 1 + nb_appels(n-1) + 1 + nb_appels(n-2)
print(fibonacci(13))
print ('nbappel',nb_appels(13))