Дерево сегментов min и max
Я пытаюсь построить дерево сегментов, родительский узел которого должен содержать минимальные и максимальные значения его дочерних узлов.Теперь, когда я пытаюсь реализовать это, я сталкиваюсь с ошибкой, которая заключается в том, что один потомок может вернуть целое число, в то время как другой потомок может вернуть список, и операционная функция max или min вызовет ошибку.Как это преодолеть?
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)
2 ответа:
Это будет работать с использованием 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])]
Edit: переформатирование для ясности:
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]) ]