Tôi giải quyết this vấn đề sử dụng segment tree nhưng tôi gặp lỗi giới hạn thời gian. Dưới đây là mã thô của tôi cho truy vấn tối thiểu trong phạm vi và bằng cách thay đổi min
thành max
trong mã của tôi, vấn đề trên có thể được giải quyết. Tôi không biết làm thế nào tôi có thể cải thiện hiệu suất của mã của tôi. Bạn có thể giúp tôi với các vấn đề hiệu suất của nó?Thực hiện phân đoạn cây bằng Python
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
Điều này có thể được triển khai lặp lại không?
'có thể bạn. giúp tôi với việc phát hành hiệu suất của [code] es? 'Bạn có muốn gợi ý tự giải quyết vấn đề hay bạn muốn các giải pháp được phân tích và mã hóa không? 'Segment's đi vào hình ảnh ở đâu? (Bạn đã đọc [mô tả của thẻ phân đoạn] (http://stackoverflow.com/tags/segment/info)?) (Được bỏ phiếu để cung cấp các tài liệu - hãy xem xét đổi tên 'rmq' để phản ánh _range truy vấn tối thiểu_ trong ngữ cảnh này.) 2cents của tôi: Vấn đề của bạn là _not_ đệ quy so với lặp lại. – greybeard
@greybeard Tôi muốn các giải pháp được phân tích và mã hóa. Trong khi thêm thẻ tôi đã viết phân đoạn cây nhưng nó đã đột nhập vào cây và phân đoạn thẻ (xin lỗi cho điều đó). –
('xin lỗi vì điều đó' - tôi lấy nó bạn _know_ cách chỉnh sửa thẻ.) Bất kỳ ai đã nghe về [cây tìm kiếm ưu tiên] (http://www.cs.princeton.edu/courses/archive/spr09/cos423/Lectures /priority-st.pdf)? – greybeard