Python 分段树最小值和最大值
我正在尝试构建一个段树,其父节点应包含其子节点的最小值和最大值。现在,当我尝试实现此操作时,我面临一个错误,即一个子节点可以返回整数,而另一个子节点可以返回列表,操作max或min函数将引发错误。如何克服此错误Python 分段树最小值和最大值,python,python-3.x,algorithm,segment-tree,Python,Python 3.x,Algorithm,Segment Tree,我正在尝试构建一个段树,其父节点应包含其子节点的最小值和最大值。现在,当我尝试实现此操作时,我面临一个错误,即一个子节点可以返回整数,而另一个子节点可以返回列表,操作max或min函数将引发错误。如何克服此错误 from math import log2,ceil def segment(low,high,pos): if (low==high): segment_tree[pos]=arr[low] return mid=(high+low)
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)
如果我正确理解问题,您可以自己编写一个最小/最大函数:
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(对象、列表)工作 编辑:为清晰起见,重新格式化:
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])
]
可能您应该在某处添加此逻辑:
sum(您的对象)if instance(您的对象,列表)else您的对象,将给出错误,因为segment_tree是一个需要在函数中定义的全局函数。@rnso我不这么认为。请看:我添加了一个重新格式化的版本来澄清这段优秀的代码。@rnso谢谢!
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])
]