二叉搜索树python_python – 生成最佳二叉搜索树(Cormen)

我正在阅读Cormen等人的“算法导论”(第3版)(PDF),关于最优二叉搜索树的第15.4节,但是在Python中为optimal_bst函数实现伪代码时遇到了一些麻烦.

以下是我尝试将最佳BST应用于的示例:

让我们将e [i,j]定义为搜索包含从i到j标记的密钥的最优二叉搜索树的预期成本.最后,我们希望计算e [1,n],其中n是键的数量(本例中为5).最终的递归表达式是:

应该通过以下伪代码实现:

请注意,伪代码可互换地使用基于1和0的索引,而Python仅使用后者.结果我在实现伪代码时遇到了麻烦.这是我到目前为止:

import numpy as np

p = [0.15, 0.10, 0.05, 0.10, 0.20]

q = [0.05, 0.10, 0.05, 0.05, 0.05, 0.10]

n = len(p)

e = np.diag(q)

w = np.diag(q)

root = np.zeros((n, n))

for l in range(1, n+1):

for i in range(n-l+1):

j = i + l

e[i, j] = np.inf

w[i, j] = w[i, j-1] + p[j-1] + q[j]

for r in range(i, j+1):

t = e[i-1, r-1] + e[r, j] + w[i-1, j]

if t < e[i-1, j]:

e[i-1, j] = t

root[i-1, j] = r

print(w)

print(e)

但是,如果我运行此权重w正确计算,但预期的搜索值e仍保持在其初始值的“卡住”:

[[ 0.05 0.3 0.45 0.55 0.7 1. ]

[ 0. 0.1 0.25 0.35 0.5 0.8 ]

[ 0. 0. 0.05 0.15 0.3 0.6 ]

[ 0. 0. 0. 0.05 0.2 0.5 ]

[ 0. 0. 0. 0. 0.05 0.35]

[ 0. 0. 0. 0. 0. 0.1 ]]

[[ 0.05 inf inf inf inf inf]

[ 0. 0.1 inf inf inf inf]

[ 0. 0. 0.05 inf inf inf]

[ 0. 0. 0. 0.05 inf inf]

[ 0. 0. 0. 0. 0.05 inf]

[ 0. 0. 0. 0. 0. 0.1 ]]

我期望e,w和root如下:

我现在已经调试了几个小时,但仍然卡住了.有人可以指出上面的Python代码有什么问题吗?

解决方法:

在我看来,你在指数中犯了一个错误.我不能按预期工作,但下面的代码应该给你一个指示我前往的地方(可能在某个地方有一个关闭):

import numpy as np

p = [0.15, 0.10, 0.05, 0.10, 0.20]

q = [0.05, 0.10, 0.05, 0.05, 0.05, 0.10]

n = len(p)

def get2(m, i, j):

return m[i - 1, j - 1]

def set2(m, i, j, v):

m[i - 1, j - 1] = v

def get1(m, i):

return m[i - 1]

def set1(m, i, v):

m[i - 1] = v

e = np.diag(q)

w = np.diag(q)

root = np.zeros((n, n))

for l in range(1, n + 1):

for i in range(n - l + 2):

j = i + l - 1

set2(e, i, j, np.inf)

set2(w, i, j, get2(w, i, j - 1) + get1(p, j) + get1(q, j))

for r in range(i, j + 1):

t = get2(e, i, r - 1) + get2(e, r + 1, j) + get2(w, i, j)

if t < get2(e, i, j):

set2(e, i, j, t)

set2(root, i, j, r)

print(w)

print(e)

结果:

[[ 0.2 0.4 0.5 0.65 0.9 0. ]

[ 0. 0.2 0.3 0.45 0.7 0. ]

[ 0. 0. 0.1 0.25 0.5 0. ]

[ 0. 0. 0. 0.15 0.4 0. ]

[ 0. 0. 0. 0. 0.25 0. ]

[ 0.5 0.7 0.8 0.95 0. 0.3 ]]

[[ 0.2 0.6 0.8 1.2 1.95 0. ]

[ 0. 0.2 0.4 0.8 1.35 0. ]

[ 0. 0. 0.1 0.35 0.85 0. ]

[ 0. 0. 0. 0.15 0.55 0. ]

[ 0. 0. 0. 0. 0.25 0. ]

[ 0.7 1.2 1.5 2. 0. 0.3 ]]

标签:python,algorithm,dynamic-programming,binary-search-tree

来源: https://codeday.me/bug/20190710/1427044.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值