【问题标题】:Find minimum element of a subsequence查找子序列的最小元素
【发布时间】:2014-10-31 19:59:41
【问题描述】:

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

  1. 初始化需要O(n)
  2. 内存空间O(n);
  3. min(i,j) 接受O(log(n))

请为此建议一种算法。

【问题讨论】:

    标签: algorithm sequence minimum subsequence


    【解决方案1】:

    Segmenttree 正是您所需要的,因为它满足您的所有要求。

    1. 使用 Segment Tree 初始化需要 O(n)
    2. 内存也是 O(n)
    3. 查询可以在 O(log n) 内完成

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

    【讨论】:

      【解决方案2】:

      段树正是您所需要的(它可以在O(n) 时间内构建,一个查询需要O(log n) 时间)。 这是一篇关于它的文章:http://wcipeg.com/wiki/Segment_tree.
      尽管有一种算法使用O(n) 时间进行初始化,O(1) 时间用于每次查询,但分段树可能是一个不错的选择,因为它要简单得多。

      【讨论】:

        【解决方案3】:

        此 TopCoder 教程:An < O(n), O(1) > approach 更详细地讨论了您的问题。在符号中,表示该方法需要 f(n) 复杂度来设置,g(n) 复杂度来查询。

        另外,这篇文章再次咀嚼算法:Range Minimum Query <O(n), O(1)> approach (from tree to restricted RMQ)

        希望他们能澄清你的问题:)

        【讨论】:

        • 谢谢。我没想到二叉树可以这么容易地解决问题。
        猜你喜欢
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2017-01-17
        • 1970-01-01
        • 2018-06-13
        相关资源
        最近更新 更多