线段树的最小值和最大值
Segment tree min and max
我正在尝试构建一个线段树,其 parent 节点应包含其 children nodes.Now 的最小值和最大值,当我尝试实现它时,我正面临一个错误是一个 child 可以 return 一个整数而另一个 child 可以 return 一个列表并且操作 max 或 min 函数将引发 error.How 来克服这个?
from math import log2,ceil
def segment(low,high,pos):
if (low==high):
segment_tree[pos]=arr[low]
return
mid=(high+low)//2
segment(low,mid,2*pos+1)
segment(mid+1,high,2*pos+2)
segment_tree[pos]=[min(segment_tree[2*pos+1],segment_tree[2*pos+2]),max(segment_tree[2*pos+1],segment_tree[2*pos+2])]
length=5
arr=[1,2,3,4,5]
low=0
high=length-1
height=int(ceil(log2(length)))
pos=0
size_of_segment_tree=2*int(pow(2,height))-1
segment_tree=[0]*size_of_segment_tree
segment(low,high,pos)
如果我理解正确,你可以自己写一个min/max函数:
def my_min(value):
if isinstance(value, list):
return min(value)
else:
return value
def my_max(value):
if isinstance(value, list):
return max(list)
else:
return value
这将使用 isinstance(object, list)
segment_tree[pos]=[min(min(segment_tree[2*pos+1]) if isinstance(segment_tree[2*pos+1],list) else segment_tree[2*pos+1],min(segment_tree[2*pos+2]) if isinstance(segment_tree[2*pos+2],list) else segment_tree[2*pos+2]),max(max(segment_tree[2*pos+1]) if isinstance(segment_tree[2*pos+1],list) else segment_tree[2*pos+1],max(segment_tree[2*pos+2]) if isinstance(segment_tree[2*pos+2],list) else segment_tree[2*pos+2])]
编辑:为清楚起见重新格式化:
segment_tree[pos]= [
min(min(segment_tree[2*pos+1])
if isinstance(segment_tree[2*pos+1],list)
else segment_tree[2*pos+1],
min(segment_tree[2*pos+2])
if isinstance(segment_tree[2*pos+2],list)
else segment_tree[2*pos+2]),
max(max(segment_tree[2*pos+1])
if isinstance(segment_tree[2*pos+1],list)
else segment_tree[2*pos+1],
max(segment_tree[2*pos+2])
if isinstance(segment_tree[2*pos+2],list)
else segment_tree[2*pos+2])
]
我正在尝试构建一个线段树,其 parent 节点应包含其 children nodes.Now 的最小值和最大值,当我尝试实现它时,我正面临一个错误是一个 child 可以 return 一个整数而另一个 child 可以 return 一个列表并且操作 max 或 min 函数将引发 error.How 来克服这个?
from math import log2,ceil
def segment(low,high,pos):
if (low==high):
segment_tree[pos]=arr[low]
return
mid=(high+low)//2
segment(low,mid,2*pos+1)
segment(mid+1,high,2*pos+2)
segment_tree[pos]=[min(segment_tree[2*pos+1],segment_tree[2*pos+2]),max(segment_tree[2*pos+1],segment_tree[2*pos+2])]
length=5
arr=[1,2,3,4,5]
low=0
high=length-1
height=int(ceil(log2(length)))
pos=0
size_of_segment_tree=2*int(pow(2,height))-1
segment_tree=[0]*size_of_segment_tree
segment(low,high,pos)
如果我理解正确,你可以自己写一个min/max函数:
def my_min(value):
if isinstance(value, list):
return min(value)
else:
return value
def my_max(value):
if isinstance(value, list):
return max(list)
else:
return value
这将使用 isinstance(object, list)
segment_tree[pos]=[min(min(segment_tree[2*pos+1]) if isinstance(segment_tree[2*pos+1],list) else segment_tree[2*pos+1],min(segment_tree[2*pos+2]) if isinstance(segment_tree[2*pos+2],list) else segment_tree[2*pos+2]),max(max(segment_tree[2*pos+1]) if isinstance(segment_tree[2*pos+1],list) else segment_tree[2*pos+1],max(segment_tree[2*pos+2]) if isinstance(segment_tree[2*pos+2],list) else segment_tree[2*pos+2])]
编辑:为清楚起见重新格式化:
segment_tree[pos]= [
min(min(segment_tree[2*pos+1])
if isinstance(segment_tree[2*pos+1],list)
else segment_tree[2*pos+1],
min(segment_tree[2*pos+2])
if isinstance(segment_tree[2*pos+2],list)
else segment_tree[2*pos+2]),
max(max(segment_tree[2*pos+1])
if isinstance(segment_tree[2*pos+1],list)
else segment_tree[2*pos+1],
max(segment_tree[2*pos+2])
if isinstance(segment_tree[2*pos+2],list)
else segment_tree[2*pos+2])
]