从未排序数组的范围中检索最大值
Retrieving maximum value from a range in unsorted array
我有一个未排序数组。我有许多查询,其中我给出了一个范围(表示为两个数组索引),然后必须返回该范围(即来自数组的指定切片)的最大值。例如:
array[]={23,17,9,45,78,2,4,6,90,1};
query(both inclusive): 2 6
answer: 78
我应该构造哪种算法或数据结构来快速检索任意范围内的最大值。(有很多查询)
编辑:我正在使用c++
我认为一些预处理是允许的。这是范围最小查询问题(这里是最大值)。在TopCoder对这个问题进行了很好的回顾。合适的数据结构:分段树和sqrt分解:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define N int(3e4)
using namespace std;
int act[N], len, sz, res[N];
int answer(int l, int r) {
int ret = -1, i;
for (i = l; i % sz && i <= r; i++)
ret = max(ret, act[i]);
for (; i + sz <= r + 1; i += sz)
ret = max(ret, res[i / sz]);
for (; i <= r; i++)
ret = max(ret, act[i]);
return ret;
}
int main() {
int i, m;
cin >> m;
for (i = 0; ; i++) {
cin >> act[i];
if (act[i] == -1)
break;
}
len = i;
for (sz = 1; sz * sz < len; sz++);
for (int j = i + 1; j < sz * sz; j++)
act[j] = -1;
for (int i = 0; i < sz * sz; i++)
res[i / sz] = max(res[i / sz], act[i]);
for (int i = 0; i + m <= len; i++)
cout << answer(i, i + m - 1) << endl;
return 0;
}
mergessort n获取范围的最后一个索引值,将我最大。
array[] ={23日,17日,9日,45岁的78年,2,4,6,90年,1};查询(包括两个):2 6
归并排序返回第6个索引var (index = 1 ..)n)
答:78
假设这是你的数组array[]={23,17,9,45,78,2,4,6,90,1};
如果你的数组不是那么大,我会建议你预处理数组并得到另一个数组:
{0,0} = 23; //between arr[0] and arr[0]
{0,1} = 23;
{0,2} = 23;
{0,3} = 45;
{9,9} = 1;
那么你的新数组就是newArr = {23,23,23,45,....., 1}
可以在0(1)中查找,例如4-5之间的最大值为newArr[4*array.length+5)-1];
总的来说,对于n个查询,您将有O(n)个查询。
空间是如果你有10000(10^4)整数,那么你的newArr = 10^8 * 4B = 400MB,所以如果你有超过10000 int,那么这将不起作用
EDIT:我想到了一些东西,但它与MBo提到的Topcoder中的算法相同。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 整数溢出,最大值为 pow(10,19)
- 以C++递归方式查找向量中的最大值
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如何使用可变参数模板类使用模板元编程获得最大值
- C++不同的最小最大值实现
- Vec3b:r/g/b 颜色的最大值为 254,而不是 255
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 查找包含 N 个元素的数组的最小值和最大值
- 井字游戏具有奇怪行为的最小最大值算法(C++)
- 错误C++在Visual Studio 2019中使用numeric_limits的长双精度最小值/最大值
- 从未排序数组的范围中检索最大值