繁体   English   中英

如何使用python构建细分树?

[英]How to build a segment tree using python?

如何使用python构建段树......我尝试了以下代码:#

def built(arr,start,end,tree,tn):
    if end==start:
        tree[tn]=arr[start]
        return
    mid=(start+end)/2
    built(arr,start,mid,tree,2*tn)
    built(arr,mid+1,end,tree,2*tn+1)
    tree[tn]=tree[2*tn]+tree[2*tn+1]


arr=[1,2,3,4,5,6]
tree=[0,0,0,0,0,0,0,0,0,0,0,0]
built(arr,0,5,tree,1)
for i in tree:
    print (i)

代码有什么问题......给出运行时错误(列表分配索引超出范围)

这会起作用

def built(arr,start,end,tree,tn):
    if end==start:
        tree[tn]=arr[start]
        return
    mid=(start+end)/2
    built(arr,start,mid,tree,2*tn)
    built(arr,mid+1,end,tree,2*tn+1)
    tree[tn]=tree[2*tn]+tree[2*tn+1]


arr=[1,2,3,4,5,6]
tree=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
built(arr,0,5,tree,1)
for i in tree:
    print (i)

tree数组的大小应为arr大小的4倍。

希望这可以帮助!

我还花了一些时间来弄清楚这一点:

段树如下所示:

                  21
            /           \
           6             15      
        /   \       /      \
       3     3     9        6
     / \          / \
    1   2        4   5 

但是,即使看起来它只有11个节点,但缺少的部分是0,真实的树是这样的:

                  21
            /           \
           6             15      
        /   \       /      \
       3     3     9        6
     / \    / \   / \      / \
    1   2  0   0 4   5    0   0

我们需要0,因为缺少0会导致混乱,例如,如果缺少0,我们就不能说4和5是9的孩子。

因为段树是完整的二叉树并且平衡(我们总是将其分成两半)。 考虑到树从索引1开始,此处树的长度必须大于等于16。

我们可以为tree = [0范围内的_分配0]并得到正确的答案:[0、21、6、15、3、3、9、6、1、2、0、0、4、5, 0,0]。

这就是我们得到4n的方式:如果数组长度不是2 ^ i,则树的高度至少应为⎣logn⎦+ 1,因此树的总节点数将为2 * 2 ^(logn + 1)= 2 ^(logn + 2)= 4 * 2 ^ logn = 4 * n

因此,我们通常分配4n大小的树。

您还可以绘制运行此代码的堆栈,在运行了几轮之后,tree [12]将为4,因此这就是代码出现错误“索引超出范围”的原因。

没有点低于树的高度,在这种情况下,您可以检查start> end并在情况为true时返回。

def built(arr,start,end,tree,tn):
    if end==start:
        tree[tn]=arr[start]
        return
    elif start > end:
        return
    mid=(start+end)/2
    built(arr,start,mid,tree,2*tn)
    built(arr,mid+1,end,tree,2*tn+1)
    tree[tn]=tree[2*tn]+tree[2*tn+1]


arr=[1,2,3,4,5,6]
tree=[0,0,0,0,0,0,0,0,0,0,0,0]
built(arr,0,5,tree,1)
for i in tree:
    print (i)

您可以初始化数组以将树构建为2 *(2 ** h)-1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM