在一些假设下在O(log(n))-时间中找到数组中的最大值

时间:2018-09-03 19:43:56

标签: algorithm data-structures

我有以下问题: 假设您获得了一个具有n个可区分数字的数组A,并假定您可以将n个元素存储在新的数据结构中(这可以帮助您解决以下问题),同时保存存储时间受O(n)限制。 为函数max(i,j)编写一个算法,该算法将输入i大于j的两个索引作为输入,并将作为输出返回A [i],A [i + 1],...,A [ j]。 max(i,j)应该以O(log(n))为边界。

我想到了二叉树,但是想不出为什么要存储数字。我可以考虑花费O(n)的存储时间的一个选项是创建“竞赛树”,但是我找不到使用这种数据结构最大化的算法。

这是一个家庭作业问题,但找不到它的标签。

2 个答案:

答案 0 :(得分:3)

这是segment tree的最典型应用。

给定一个数字数组,您可以在O(n)时间复杂度的基础上构建一个分段,并在O(logn)时间内对间隔/范围执行查询。

一些常见的应用示例-查找从索引ij的元素总和,其中0 <= i <= j <= n - 1,从索引i到{{ 1}},其中j等。

答案 1 :(得分:0)

您可以使用优先级队列来解决它。

using namespace std;
#include<iostream>
#include<vector>
#include<algorithm>
int deq[100],length=0;
void increase_value(int arr[],int i,int val)
{
    arr[i]=val;
    while(i>1 && arr[i/2]<arr[i])
    {
        int temp=arr[i];
        arr[i]=arr[i/2];
        arr[i/2]=temp;
        i=i/2;
    }
}
void insert_element(int arr[],int val)
{
    length=length+1;
    increase_value(arr,length,val);
}
int main()
{
    int arr[10000];
    int size,lw,up;
    cin>>size;
    for(int i=1;i<=size;i++)
    {
        cin>>arr[i];
    }
    cin>>lw>>up;
    for(int i=lw;i<=up;i++)
    {
        insert_element(deq,arr[i]);
    }
    cout<<deq[1]<<endl;
}