[英]Optimal Search Tree Using Python - Code Analysis
首先,抱歉这个幼稚的问题。 但我在别处找不到帮助
我正在尝试使用 Python 中的动态编程创建一个最佳搜索树,它接收两个列表(一组键和一组频率)并返回两个答案:
1 - 最小的路径成本。
2 - 以最小成本生成的树。
我基本上需要创建一个由顶部访问最多的项目(访问最多的项目是根)组织的树,并通过使用动态编程解决方案从该树返回最小的路径成本。
我使用 Python 实现了以下代码:
def optimalSearchTree(keys, freq, n):
#Create an auxiliary 2D matrix to store results of subproblems
cost = [[0 for x in xrange(n)] for y in xrange(n)]
#For a single key, cost is equal to frequency of the key
#for i in xrange (0,n):
# cost[i][i] = freq[i]
# Now we need to consider chains of length 2, 3, ... .
# L is chain length.
for L in xrange (2,n):
for i in xrange(0,n-L+1):
j = i+L-1
cost[i][j] = sys.maxint
for r in xrange (i,j):
if (r > i):
c = cost[i][r-1] + sum(freq, i, j)
elif (r < j):
c = cost[r+1][j] + sum(freq, i, j)
elif (c < cost[i][j]):
cost[i][j] = c
return cost[0][n-1]
def sum(freq, i, j):
s = 0
k = i
for k in xrange (k,j):
s += freq[k]
return s
keys = [10,12,20]
freq = [34,8,50]
n=sys.getsizeof(keys)/sys.getsizeof(keys[0])
print(optimalSearchTree(keys, freq, n))
我正在尝试输出答案 1。根据动态规划解决方案,该树的最小成本应该是 142(存储在矩阵位置 [0][n-1] 上的值)。 但不幸的是它返回 0。我在该代码中找不到任何问题。 怎么了?
您的代码中有几个非常有问题的语句,绝对是受到 C/Java 编程实践的启发。 例如,
keys = [10,12,20]
freq = [34,8,50]
n=sys.getsizeof(keys)/sys.getsizeof(keys[0])
我认为您认为您计算了列表中的项目数。 但是, n
不是 3:
sys.getsizeof(keys)/sys.getsizeof(keys[0])
3.142857142857143
你需要的是这个:
n = len(keys)
还有一个发现: elif (r < j)
总是True
,因为 r 处于i
(包含)和j
(不包含)之间的范围内。 从不检查elif (c < cost[i][j])
条件。 矩阵c
永远不会在循环中更新——这就是为什么你总是以 0 结束。
另一个建议:不要覆盖内置函数sum()
。 您的同名函数计算列表切片中所有项目的总和:
sum(freq[i:j])
import sys
def optimalSearchTree(keys, freq):
#Create an auxiliary 2D matrix to store results of subproblems
n = len(keys)
cost = [[0 for x in range(n)] for y in range(n)]
storeRoot = [[0 for i in range(n)] for i in range(n)]
#For a single key, cost is equal to frequency of the key
for i in range (0,n):
cost[i][i] = freq[i]
# Now we need to consider chains of length 2, 3, ... .
# L is chain length.
for L in range (2,n+1):
for i in range(0,n-L+1):
j = i + L - 1
cost[i][j] = sys.maxsize
for r in range (i,j+1):
c = (cost[i][r-1] if r > i else 0)
c += (cost[r+1][j] if r < j else 0)
c += sum(freq[i:j+1])
if (c < cost[i][j]):
cost[i][j] = c
storeRoot[i][j] = r
return cost[0][n-1], storeRoot
if __name__ == "__main__" :
keys = [10,12,20]
freq = [34,8,50]
print(optimalSearchTree(keys, freq))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.