【发布时间】:2014-10-31 19:59:41
【问题描述】:
给定一个由n 整数元素组成的序列S,我需要一个函数min(i,j),它可以找到索引i 和索引j(包括两者)之间序列的最小元素,这样:
- 初始化需要
O(n); - 内存空间
O(n); -
min(i,j)接受O(log(n))。
请为此建议一种算法。
【问题讨论】:
标签: algorithm sequence minimum subsequence
给定一个由n 整数元素组成的序列S,我需要一个函数min(i,j),它可以找到索引i 和索引j(包括两者)之间序列的最小元素,这样:
O(n);O(n);min(i,j) 接受O(log(n))。请为此建议一种算法。
【问题讨论】:
标签: algorithm sequence minimum subsequence
Segmenttree 正是您所需要的,因为它满足您的所有要求。
除此之外,树是动态的,可以支持 O(log n) 的更新。这意味着可以在 O(log n) 中修改某个元素 i 的元素,并且仍然可以检索最小值。
【讨论】:
段树正是您所需要的(它可以在O(n) 时间内构建,一个查询需要O(log n) 时间)。
这是一篇关于它的文章:http://wcipeg.com/wiki/Segment_tree.
尽管有一种算法使用O(n) 时间进行初始化,O(1) 时间用于每次查询,但分段树可能是一个不错的选择,因为它要简单得多。
【讨论】:
此 TopCoder 教程:An < O(n), O(1) > approach 更详细地讨论了您的问题。在符号中,表示该方法需要 f(n) 复杂度来设置,g(n) 复杂度来查询。
另外,这篇文章再次咀嚼算法:Range Minimum Query <O(n), O(1)> approach (from tree to restricted RMQ)。
希望他们能澄清你的问题:)
【讨论】: