【问题标题】:How to find maximum value in any range of an array in log(n) time? [closed]如何在 log(n) 时间内找到数组任何范围内的最大值? [关闭]
【发布时间】:2012-02-27 15:05:16
【问题描述】:

例如数组:{1、5、2、3、2、10}

范围:0-1 答案:5 范围:2-4 答案:3 范围:0-5 答案:10 等等

【问题讨论】:

  • 你不能。为了在未排序的序列中找到最大值,您必须至少查看每个值一次。这使得算法 O(n)。
  • @sbi:除非您对数组进行预处理并构建搜索树/表/任何东西以比搜索子范围更快地给出任何子范围的最大值。大概就是这个问题要问的,虽然有点简洁。
  • @Mike:虽然这是真的,但我不会称这样的野兽为“未排序的序列”。我是故意留下这个漏洞的,你知道吗? :)
  • 您是否考虑过建造一台量子计算机来做到这一点?
  • 你可以看看我的评论。

标签: c++ algorithm binary-search-tree indexed


【解决方案1】:

如果数组未排序,则无法按照您的要求进行操作。

要找到最大值,您至少需要检查范围内的所有元素,这需要 O(n)。

如果您允许对数据进行某种形式的预处理,这很容易。你可以用答案构建一个 n2 查找表。然后你可以在恒定时间内找到任何范围的最大值。

【讨论】:

    【解决方案2】:

    这是不可能的。您必须访问每个元素。

    如果你的数组是先验排序的,那么它就是 O(1) 操作。

    【讨论】:

      【解决方案3】:

      另见此处: What is the best way to get the minimum or maximum value from an Array of numbers?

      正如其他人指出的那样,这是不可能的

      【讨论】:

        【解决方案4】:

        @Daniel Talamas 如果我理解正确,你想要这个:

        #include <iostream>
        #include <algorithm>
        #include <vector>
        using namespace std;
        int maxlement(int range1,int range2) {
        std::vector<int> v{ 1, 5, 2, 3, 2, 10 };
        std::vector<int>::iterator result;
        
        result = std::max_element(v.begin()+range1, v.begin()+range2+1);
        int dist = std::distance(v.begin(), result);
        return v[dist];
        
        }
        int main() {
        int range1,range2;
        cout<<"From ";
        cin>>range1;
        cout<<"To ";
        cin>>range2;
        cout<<"Max Element Is "<<maxlement(range1,range2);
        return 0;
        }
        

        【讨论】:

        • 仅在对数而非线性时间中。
        猜你喜欢
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多