繁体   English   中英

使用 Python 优化搜索树 - 代码分析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM