范围最值查询 (Range Minimum Query)
问题
在数组 [l, r]
中查找最值
思路
- 在数组
[l, r]
中的最值等于
([l, (l+r)/2]
中的最值 +[(l+r)/2 + 1, r]
中的最值)的最值 - 直到子问题中数组小于等于 2, 即可简单求解
- 合并子问题的解,得到最终解
代码
(define (rmq vec l r m)
(if (< (- r l) 2)
(m (vector-ref vec l) (vector-ref vec r))
(m (rmq vec
l
(quotient (+ l r) 2)
m)
(rmq vec
(+ (quotient (+ l r) 2) 1)
r
m))))
(rmq v
0
(- (vector-length v) 1)
(lambda (a b)
(if (< a b)
a
b)))