我適於僞代碼用於從Cormen優化的二叉搜索樹算法運行一些樣本數據,但有一個邏輯錯誤的地方,是防止正確的輸出在根目錄。邏輯錯誤時尋找優化的二進制搜索樹在Python
我覈對Cormen幾次的代碼,它出現的問題是在我的名單指數(標)。
但由於在這種情況下Cormen在圖中同時使用零基礎和一家立足陣列,我完全不知道如何修改我的列表索引來解決這個問題。看來作者打破了這個特定算法典型的基於文本的慣例。
任何對OBST經驗可以看到必要的調整以糾正下面的Python?
def obst(p,q):
"""Adapted from Cormen, pg. 402"""
n = len(q)
rn = range(n)
e = [[99999]*n for _ in rn]
w = [[0]*n for _ in rn]
root = [[0]*n for _ in rn]
for i in range(1, n):
e[i][i - 1] = w[i][i - 1] = q[i - 1]
for l in range(1,n):
for i in range(1, n-l):
j = i+l-1
w[i][j] = w[i][j-1] + p[j] + q[j]
for r in range(i,j+1):
t = e[i][r-1] + e[r+1][j] + w[i][j]
if t < e[i][j]:
e[i][j] = t
root[i][j] = r
return (e,root)
if __name__ == "__main__":
p = [0, 0.15, 0.1, 0.05, 0.1, 0.2]
q = [0.05, 0.1, 0.05, 0.05, 0.05, 0.1]
assert len(p) == len(q)
d = obst(p,q,len(p))
print(d[1])
編輯:我改變了一些指數。根據Cormen,對於單獨的根表(其是在返回的元組的第二元件)的預期的輸出如下所示:
[
[0, 0, 0, 0, 0, 0],
[0, 1, 1, 2, 2, 2],
[0, 0, 2, 2, 2, 4],
[0, 0, 0, 3, 4, 5],
[0, 0, 0, 0, 4, 5],
[0, 0, 0, 0, 0, 5],
[0, 0, 0, 0, 0, 0]
]
我的輸出,當n爲len(p)
:
[
[0, 0, 0, 0, 0, 0],
[0, 1, 2, 3, 4, 0],
[0, 0, 2, 3, 4, 0],
[0, 0, 0, 3, 4, 0],
[0, 0, 0, 0, 4, 0],
[0, 0, 0, 0, 0, 0]
]
預期產量是多少? – AChampion
您的分配'e [i] [j] = float('inf')'需要移出循環。 – AChampion
@achampion請參閱編輯 –