2013-05-04 52 views
-2

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

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

哪个算法或数据结构我构建快速检索从任意范围的最大值。 (有很多的查询)

编辑: 我使用C++

+0

使用您正在使用的编程语言的内置'max()'函数。这将是最快的。 – 2013-05-04 09:27:23

+0

@ sudeepdino008您正在使用哪种语言。 – 2013-05-04 09:31:39

+0

我试着将列表转换为'(index,value)'元组列表,按照'value'降序排序,然后在查询上遍历这个列表并返回第一个值,其中索引位于给定范围。尽管如此,范围与整个列表相关的范围越小,速度越慢。对于小范围,它可能会在某个点更快地查找线性最大值。 – millimoose 2013-05-04 09:36:46

回答

0

归并ň得到的范围内的最后一个索引值将我最大。

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

归并返回第6指数VAR(指数= 1个.. N)

答案:78

+0

他要为每个查询执行新的mergesort吗?排序可能是最糟糕的想法在这里 – smttsp 2013-05-04 11:18:35

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,所以如果你有超过10000 INT,那么这难道不工作

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

+0

我有大约(10^5)长度的数组。约 – sudeepdino008 2013-05-04 11:14:27

+0

约。你有多少次要使用这种方法? – smttsp 2013-05-04 11:16:49