从未排序数组中的范围中检索最大值

时间:2013-05-04 09:22:33

标签: c++ arrays algorithm sorting data-structures

我有一个未排序的数组。我有很多查询,其中我给出一个范围(表示为两个数组索引),然后必须返回该范围的最大值(即,来自指定的数组切片)。 例如:

array[]={23,17,9,45,78,2,4,6,90,1};
query(both inclusive): 2 6
answer: 78

我构建哪种算法或数据结构以快速从任何范围检索最大值。 (有很多疑问)

修改 我正在使用C ++

3 个答案:

答案 0 :(得分:4)

我认为允许一些预处理。它是范围最小查询问题(此处为最大值)。 Good review of this problem at TopCoder。 合适的数据结构:细分树和Sqrt-decomposition

#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;
}

答案 1 :(得分:0)

mergesort n获取范围的最后一个索引值,因为我最大。

阵列[] = {23,17,9,45,78,2,4,6,90,1}; 查询(包括两者):2 6

mergesort返回第6个索引var(index = 1 .. n)

答案:78

答案 2 :(得分:0)

说这是你的数组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}

您可以在O(1)中找到搜索,例如,4-5之间的最大值为newArr[4*array.length+5)-1]; 总的来说,对于n个查询,您将获得O(n)。

空格如果你有 10000(10 ^ 4)整数,那么你的 newArr = 10 ^ 8 * 4B = 400MB ,所以如果你有< strong> 10000 int ,那么这无效

编辑:我想到了一些东西,但它与algorithm in Topcoder相同, MBo 提及。