我有以下问题: 假设您获得了一个具有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)的存储时间的一个选项是创建“竞赛树”,但是我找不到使用这种数据结构最大化的算法。
这是一个家庭作业问题,但找不到它的标签。
答案 0 :(得分:3)
这是segment tree的最典型应用。
给定一个数字数组,您可以在O(n)
时间复杂度的基础上构建一个分段,并在O(logn)
时间内对间隔/范围执行查询。
一些常见的应用示例-查找从索引i
到j
的元素总和,其中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;
}