现在的位置: 首页 > 综合 > 正文

最优二叉查找树

2013年10月19日 ⁄ 综合 ⁄ 共 1131字 ⁄ 字号 评论关闭

>>算法导论P217

def Optimal_BST(p,q,n):
    e=[[0 for col in range(n+1)]for row in range(n+2)] #期望代价
    w=[[0 for col in range(n+1)]for row in range(n+2)] #概率总和
    root=[[0 for col in range(n+1)]for row in range(n+2)] #根节点
    for i in range(1,n+2):
        e[i][i-1]=q[i-1]
        w[i][i-1]=q[i-1]
    for L in range(1,n+1):
        for i in range(n-L+2):
            j=i+L-1
            e[i][j]=float('inf')
            w[i][j]=w[i][j-1]+p[j]+q[j]
            for r in range(i,j+1): #可用Knuth结果改进算法复杂度
                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
                    
    Construct_Optimal_BST(root,1,n,n,0)
    return 0
        
    
    
   
def Construct_Optimal_BST(root,i,j,n,count):
    count+=1
    if count>(2*n+1):
        return 
    if i==1 and j==n:
        print('K'+str(root[i][j])+' is the root')
    if i<j:
        if root[i][root[i][j]-1]>0 :
            print('K'+str(root[i][root[i][j]-1])+' is the left child of K'+str(root[i][j]))
        Construct_Optimal_BST(root,i,root[i][j]-1,n,count)
        if root[root[i][j]+1][j]>0 :
            print('K'+str(root[root[i][j]+1][j])+' is the right child of K'+str(root[i][j]))
        Construct_Optimal_BST(root,root[i][j]+1,j,n,count)
    if i==j:
        print('d'+str(i-1)+' is the left child of K'+str(i))
        print('d'+str(i)+' is the right child of K'+str(i))
    if i>j:
        print('d'+str(j)+' is the right child of K'+str(j))
        
    

#test
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]
n=len(p)-1
Optimal_BST(p,q,n)
            

抱歉!评论已关闭.