【发布时间】:2009-10-27 21:40:34
【问题描述】:
我尝试实现 Donald E. Knuth 的 Algorithm O (Oriented forests):“计算机编程的艺术 - 第 4 卷,Fascile 4,生成所有树”(第 24 页)。
我的 Python 解决方案是:
def generate_oriented_forest(n):
"""Algorithm O from Knuth TAoCP, Fascicle 4, p. 25. """
p = range(-1, n)
while True:
yield p[1:]
if p[n] > 0: p[n] = p[p[n]]
else:
k_largest = 0
for k in range(1,n):
if p[k] != 0: k_largest = k
k = k_largest
if k == 0: return
j = p[k]
d = k-j
if p[k-d] == p[j]: p[k] = p[j]
else: p[k] = p[k-d] + d
while k != n:
#print k, p
k = k+1
if p[k-d] == p[j]: p[k] = p[j]
else: p[k] = p[k-d] + d
if __name__ == "__main__":
for el in generate_oriented_forest(4):
print el
# According to page 23 and also Table 1 p.4 I would expect the sequence:
# 0123, 0122, 0121, 0120, 0111, 0110, 0101, 0100, 0000
我的实现给了我:
[0, 1, 2, 3], [0, 1, 2, 2], [0, 1, 2, 1], [0, 1, 2, 0], [0, 1, 1, 1], [0, 1, 1, 0],
[0, 1, 0, 3],
[0, 1, 0, 0], [0, 0, 0, 0]。
我已经在寻找一个错误太久了。希望有人能指出我修复代码的正确方向。我对算法的理解正确吗?对我的 python 风格的任何改进也值得赞赏。感谢您的帮助。
【问题讨论】:
-
首先 - 尝试将所有名称为 "j","d","k" ... 的变量重命名为更易读的名称。它有助于解决您的问题。
-
@Oduvan,我相信这些是文中使用的变量名
-
@gnibbler,如果您无法阅读代码,那么您将难以理解它,甚至无法修复它。 ;P
-
@The共产鸭,有意义的名字很重要,但是当从论文中实现算法时,使用与算法中使用的相同的变量名通常是个好主意,所以你的争吵是与 Knuth 的不使用更有意义的名称