给定S
整数元素的序列n
,我需要一个函数min(i,j)
,它找到索引i和索引j(包括两者)之间序列的最小元素,这样:
O(n)
; O(n)
; min(i,j)
需要O(log(n))
。请为此建议一种算法。
答案 0 :(得分:0)
此TopCoder教程:An < O(n), O(1) > approach以更详细的方式讨论您的问题。在表示法中,意味着该方法需要f(n)复杂度来设置,并且g(n)复杂度要进行查询。
此外,这篇文章再次咀嚼算法:Range Minimum Query <O(n), O(1)> approach (from tree to restricted RMQ)。
希望他们澄清你的问题:)
答案 1 :(得分:0)
段树就是您所需要的(它可以在O(n)
时间内构建,一个查询需要O(log n)
次。
这是一篇关于它的文章:http://wcipeg.com/wiki/Segment_tree
尽管有一种算法使用O(n)
时间进行初始化并且每个查询使用O(1)
时间,但是段树可能是一个很好的选择,因为它更简单。
答案 2 :(得分:0)
Segmenttree就是您所需要的,因为它满足您的所有要求。
除此之外,树是动态的,可以支持O(log n)中的更新。这意味着可以在O(log n)中修改某个元素i的元素,并仍然检索最小值。