簡體   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