- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读 Cormen 等人的算法导论(第 3 版)(PDF),关于最佳二叉搜索树的第 15.4 节,但是我在实现伪代码时遇到了一些麻烦optimal_bst
Python 中的函数。
这是我尝试将最佳 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 - 生成最优二叉搜索树 (Cormen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46160969/
我正在 Cormen 等人的算法简介中研究最优二叉搜索树。作为引用,我附上了 text link . 在第 399 页,我们有一个有贡献的表格。我无法理解作者如何计算此专栏。例如节点k1的贡献是0.3
在阅读 cormen 的“算法导论”第 15 章:动态规划中的动态规划时,我遇到了这个语句 When developing a dynamic-programming algorithm, we fo
在Cormen中,第47页分析Insertion sort时,第5行伪代码被执行的次数是t-1的j=2到j=n的总和? 我不明白。如果你读过 Cormen,请帮助我。 最佳答案 我不会给你答案,但我会
在 Cormen 定理 3.1 中说 例如,插入排序的最佳情况运行时间是big-omega(n),而最坏情况插入排序的运行时间是Big-oh(n^2)。因此,插入排序的运行时间介于 big-omega
在《算法导论》一书中,快速排序一章中描述的快速排序算法不使用霍尔分区。 谁能告诉我这种方法相对于流行的霍尔分区的优势。还是只是作者的选择问题? 最佳答案 second edition 中的注释(自第一
我正在刷新算法理论(来自 Cormen)。 在二进制尝试的章节中有一个练习要求: Can the min-heap property be used to print out the keys of
我正在阅读 Cormen 等人的算法导论(第 3 版)(PDF),关于最佳二叉搜索树的第 15.4 节,但是我在实现伪代码时遇到了一些麻烦optimal_bst Python 中的函数。 这是我尝试将
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
Cormen 的《Introduction to algorithms》一书第 9 章有一个问题post office location problem。 We are given n points
大约 3 周前,我在空闲时间开始阅读 Cormen 等人的《算法简介》。我完成了第二章,并且已经尝试了很长一段时间的练习。我觉得它们有点难。 这正常吗?我应该在继续之前完成所有练习吗?或者,如果我解决
我是根据Cormen的Introduction to Algorithms中的伪代码用Python实现红黑树的。 我想亲眼看看我的 insert 真的是 O(logn) 所以我绘制了插入 n=1 所花
我正在学习 Cormen 的堆排序。当我尝试在数组上运行堆排序时,出现问题并且程序崩溃(段错误)。我尝试在堆排序函数中放入一些 printf 并打印 h->size 和 h->count 值,但它们似
在 Cormen 问题 22.2.6 中,我们有摔跤手问题。它说有 N 个摔跤手,即 N 个节点和 r 对竞争,即边缘,我们需要将摔跤手分为好人和坏人,这样就没有 2 个好人是对手。 给出的解决方案是
我正在阅读 Cormen 等人的算法导论中的 Rabin-Karp 算法。 www.cs.uml.edu/~kdaniels/courses/ALG_503_F08/503_lecture11.ppt
我正在阅读 Cormen 的“算法导论”一书,并根据伪代码创建了以下内容。但是,Array 的前两个元素似乎没有排序。我无法发现错误(可能是因为它晚了)。所以我想知道是否有人可以第一眼看到。 #inc
所以我试图实现 Cormen's pseudocode用于冒泡排序,但我似乎无法让它工作。 这是我对 Cormen 伪代码的处理方法: void BUBBLE_SORT(int a[200], int
我尝试了 cormen 为 bfs 指定的算法, 代码是: bfs(int s){ int i; int u,v; struct edge *e; gr
我正在研究 Cormen 的“算法导论第 2 版”中的 Ford-Fulkerson 算法。它在有向图 G=(V, E) 的伪代码中描述如下,其中 f 是定义在 VxV 上的流 FORD-FULKER
我已经阅读并搜索过有关 Floyd Warshall 算法的内容,我想我理解它。但是在我在“算法简介(Thomas H. Cormen 的书)”一书中读到的例子中,我在一个点上堆叠。我很困惑。这是一张
对于我的算法,我需要另一个名为 h(k, i) 的函数,我认为它会搜索散列以查看它是否为空,然后将元素插入到 i 位置,但我不确定。有人可以向我解释那个功能吗?谢谢。到目前为止,这是我的代码。 #
我是一名优秀的程序员,十分优秀!