English 中文(简体)
定向森林 TAoCP - Algorithm in python
原标题:Oriented forest TAoCP - Algorithm in python
  • 时间:2009-10-27 21:40:34
  •  标签:
问题回答

<><>Congratulations!>

它肯定会像你刚才发现的青.素的错误。 毫无疑问,你知道,这种错误的首批发现者获得六美元(从San Seriffe银行提取)的奖励。 我要说一遍,我可以告诉你,把你挂在墙上是一件大事。

当然,在我看来,“<>+d”步骤O5中的“”是错误的;至少,我可以找到一种办法,使之与在算法之前的文本描述中的“cloning”步骤相一致。 我检查了最近埃尔拉特纳的V4f4, 而现在还没有这样做,因此,我看着你是首先注意到这一点的。

为了核实,我建议你计算“n=5”的数值,并计算“+d”的数值,并得出与预期结果相符的数值。 如果我持怀疑态度,通过电子邮件将其写上并寄给Knuth(TAOCP的地址在他的网站上),以及你的邮政地址,你应在6个月内收到答复(通过纸质邮件)。

我不理解算法,如果我建议对算法(低于)的改动是正确还是不正确的话,我没有想法。 我知道,它产生你引述的N=4的预期产出:

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]]
            continue
        for k in range(n-1,0,-1):
            if p[k] != 0: break
        else:
            break
        j = p[k]
        d = k-j
        while True:
            if p[k-d] == p[j]:
                p[k] = p[j]
            else:
                p[k] = p[k-d]
            if k==n:
                break
            k+=1

我把格文勒的法典作为起点。 我使用了traceit()和打印说明,以遵循从[0、1、0]->过渡到的守则;[0、1、0、3]。

我认为,这是变量状况:

[0, 1, 1, 0]  # the last yield
k: 4
d: 2
j: 1
p: [-1, 0, 1, 0, 0]
[0, 1, 0, 3]  # the problem yield

这是执行该法典的唯一时间:

__main__:19:             if p[k-d] == p[j]:
__main__:22:                 p[k] = p[k-d] + d

Since p[k-d]=p[2]=1, and you want p[k] 纽约总部 equal 1, I "guess" the correct formula should be p[k]=p[k-d].

我也做了改动。

for k in range(n-1,-1,-1):

纽约总部

for k in range(n-1,0,-1):

纽约总部 s纽约总部p the code from yielding an extra [0, 0, 0, 0] at the end.

I refactored your code a little, mostly to eliminate the duplication in step 5.
However the output is still the same as you are getting

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]]
            continue
        for k in range(n-1,0,-1):
            if p[k] != 0: break
        else:
            break
        j = p[k]
        d = k-j
        while True:
            if p[k-d] == p[j]:
                p[k] = p[j]
            else:
                p[k] = p[k-d] + d
            if k==n:
                break
            k+=1

if __name__ == "__main__":
    for el in generate_oriented_forest(4):
        print el

我gged倒了原来的手工艺:SIAM Journal of Electric, T. Beyer and S.M. Hedetniemi, Constant Time Generation of neg corporations.” 该文件对算法作了很好的解释。 我在此执行:

def generate_oriented_forest_2(n): 
    """SIAM J. COMPUT. Vol. 9, No. 4, November 1980
    T. Beyer and S.M. Hedetniemi: constant time generation of rooted trees.""" 

    L = range(-1, n) 
    while True: 
        yield L[1:] 
        if L[n] > 0: L[n] = L[L[n]] 
        else:
            for p in range(n-1, 0, -1): 
                if L[p] != 0: break
            else: break
            for q in range(p-1, 0, -1):
                if L[q] == L[p] - 1: break 
            i = p
            while i <= n:
                L[i] = L[i-(p-q)]
                i += 1 

页: 1 页: 1 冷却。

答案是:每个人都是正确的!

Knuth 算法计算了母体代码,而不是等级代码。 似乎“THE Donald”在母体编码方面仍在考虑,即便在标注B &时,H算法则使用等级代码。

但是,如果你看一下Algorithm O的案文,你就应当注意到,Knuth提到,“每个运河林地由母点顺序直接代表1......pn,以之顺序排列。”

So, this algorithm is supposed to use parent codes, not level codes. That Knuth, he s a crafty one... So, I blatantly copied unutbu s code, to come up with a level code-generating version that looks more like what you wrote:

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]]
             continue
         for k in range(n-1,0,-1):
             if p[k] != 0: break
         else:
             break
         j = p[k]
         for q in range(1,k):
             if p[k-q] == p[j]: break
         while True:
             p[k] = p[k-q]
             if k==n:
                 break
             k+=1

 if __name__ == "__main__":
     for el in generate_oriented_forest(4):
         print el 

希望回答你的问题:





相关问题