2013-05-04 27 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