我正在使用线段树解决这个问题,但我得到了时间限制错误。以下是用于区间最小查询的原始代码,并通过在我的代码中更改
这个能分步实现吗?
min
为max
来解决上述问题。我不知道如何改进代码的性能。你可以帮我优化一下吗?t = [None] * 2 * 7 # n is length of list
def build(a, v, start, end):
'''
A recursive function that constructs Segment Tree for list a.
v is the starting node
start and end are the index of array
'''
n = len(a)
if start == end:
t[v] = a[start]
else:
mid = (start + end) / 2
build(a, v * 2, start, mid) # v*2 is left child of parent v
# v*2+1 is the right child of parent v
build(a, v * 2 + 1, mid + 1, end)
t[v] = min(t[2 * v], t[2 * v + 1])
return t
print build([18, 17, 13, 19, 15, 11, 20], 1, 0, 6)
inf = 10**9 + 7
def range_minimum_query(node, segx, segy, qx, qy):
'''
returns the minimum number in range(qx,qy)
segx and segy represent the segment index
'''
if qx > segy or qy < segx: # query out of range
return inf
elif segx >= qx and segy <= qy: # query range inside segment range
return t[node]
else:
return min(range_minimum_query(node * 2, segx, (segx + segy) / 2, qx, qy), range_minimum_query(node * 2 + 1, ((segx + segy) / 2) + 1, segy, qx, qy))
print range_minimum_query(1, 1, 7, 1, 3)
# returns 13
这个能分步实现吗?
segment
s在这个问题中起什么作用?(你有阅读过segment
标签的描述吗?)(提供文档字符串而获得点赞-考虑将rmq
重命名以反映此上下文之外的_范围最小查询_。)我的建议:你的问题不是递归与迭代的问题。 - greybeardsegment-tree
,你可能会对build()
是否真的构建了一棵“区间树”产生疑问:通常在原子间隔的边界上具有明确的坐标,而不是任何有效的索引,并且集合的段重叠。您选择使end
包含似乎是不寻常的,并且注释“查询范围内的线段范围”倒退了。(我不知道您的代码为什么应该超过最优解的两倍以上。) - greybeardarray.array
替换list
。 - Nizam Mohamed