在下面的递归函数中,我在Python中应用了一些记忆化技术,将先前计算的值保存在一个字典中,理论上应该具有O(1)的存储和检索。然而,使用记忆化比简单递归的执行时间要长大约三倍。
在下面的两个代码片段中,第二个代码的更高执行时间可能的原因是什么?我是否错误地使用了字典?
简单的递归函数:
在下面的两个代码片段中,第二个代码的更高执行时间可能的原因是什么?我是否错误地使用了字典?
简单的递归函数:
import time
def deletion_distance(str1, str2):
if str1 is "":
return len(str2)
elif str2 is "":
return len(str1)
else:
if str1[len(str1) - 1] == str2[len(str2) - 1]:
return deletion_distance(str1[:-1],str2[:-1])
else:
return 1 + min(deletion_distance(str1, str2[:-1]),deletion_distance(str1[:-1],str2))
str1 = "dragonified"
str2 = "infinitezimal"
start = time.time()
for i in range(0,2):
deletion_distance(str1,str2)
end = time.time()
print((end - start) / 2)
使用字典进行记忆化的动态规划:
import time
def deletion_distance(str1, str2):
global aux_dict
if str1 is "":
return len(str2)
elif str2 is "":
return len(str1)
else:
if str1[len(str1) - 1] == str2[len(str2) - 1]:
if "1"+str1[:-1]+"2"+str2[:-1] in aux_dict:
return aux_dict["1"+str1[:-1]+"2"+str2[:-1]]
else:
aux_dict["1"+str1[:-1]+"2"+str2[:-1]] = deletion_distance(str1[:-1],str2[:-1])
return aux_dict["1"+str1[:-1]+"2"+str2[:-1]]
else:
return 1 + min(
aux_dict["1"+str1+"2"+str2[:-1]] if "1"+str1+"2"+str2[:-1] in aux_dict else deletion_distance(str1, str2[:-1]),
aux_dict["1"+str1[:-1]+"2"+str2] if "1"+str1[:-1]+"2"+str2 in aux_dict else deletion_distance(str1[:-1],str2))
aux_dict = {}
str1 = "dragonified"
str2 = "infinitezimal"
start = time.time()
for i in range(0,2):
deletion_distance(str1,str2)
end = time.time()
print((end - start) / 2)
这两个函数计算两个字符串的删除距离(PRAMP.COM问题),即需要从两个字符串中删除的最少字符数,使得它们变成相同的字符串。
is
来比较字符串。 - Danielaux_dict
不能是一个局部变量。 - Robᵩ