找到子序列的最小元素

时间:2014-09-07 12:12:22

标签: algorithm sequence minimum subsequence

给定S整数元素的序列n,我需要一个函数min(i,j),它找到索引i和索引j(包括两者)之间序列的最小元素,这样:

  1. 初始化需要O(n);
  2. 记忆空间O(n);
  3. min(i,j)需要O(log(n))
  4. 请为此建议一种算法。

3 个答案:

答案 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就是您所需要的,因为它满足您的所有要求。

  1. 初始化采用带有段树的O(n)
  2. 记忆也是O(n)
  3. 查询可以在O(log n)
  4. 中完成

    除此之外,树是动态的,可以支持O(log n)中的更新。这意味着可以在O(log n)中修改某个元素i的元素,并仍然检索最小值。