【发布时间】:2016-12-11 11:18:45
【问题描述】:
我正在使用segment tree 解决this 问题,但出现时间限制错误。
下面是我的范围最小查询的原始代码,通过在我的代码中将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
这可以迭代实现吗?
【问题讨论】:
-
can you help me with [the code's] performance issues?您想要自己解决问题的提示,还是想要分析和编码的解决方案?segments 在哪里出现? (你读过description of the segment tag 吗?)(赞成提供文档字符串 - 考虑重命名rmq以反映 range minimum query 在这种情况下。)我的 2cents:你的问题是 not 递归与迭代。 -
@greybeard 我想要分析和编码的解决方案。在添加标签时,我写了段树,但它分成了树和段标签(对不起)。
-
(
sorry for that- 我认为你知道如何编辑标签。)有人听说过priority search tree吗? -
对于任何性能问题,我推荐Python“线程”模块。它允许同时运行多个东西。
-
如果这被标记为
segment-tree,您可能会怀疑build()是否构建了一个段树:更常见的是原子区间的边界比任何有效的索引有明确的坐标,并且集合的片段重叠。您选择拥有endinclusive 似乎不合常规,而评论query range inside segment range则倒退。 (我不知道为什么你的代码应该比最优值的两倍多。)
标签: python algorithm segment-tree