2016-11-24 84 views
4

我已經給定的n整數的數組A,並且在X D爲每個查詢我必須找到最大元件在子陣列[Ax , A(x-D),A(x-2D)..]線段樹查詢爲最大數

例如形式Q查詢:

A = [1,2,3,4,5,6,17,8] 
we have query 7 2 
Sub Array [17,5,3,1] Ans=17 

我們怎樣才能用的時間複雜度比O(Q*N)因爲沒有索引更新更好的解決這個問題,能不能用一些技術

我不離線解決t認爲Square Decomposition將在這裏工作。

+0

每個查詢的'O(sqrt N)'足夠好嗎?如果不是,是什麼讓你認爲它不起作用? – kraskevich

+0

什麼(在這種情況下)是一個「分段樹」,這個問題中提出的問題是什麼關係?如果'Q'是查詢,'O(Q * N)'中的Q是什麼? – greybeard

回答

1

D大於sqrt(N)。然後序列x,x - d,x - 2 * d,...最多包含sqrt(N)個元素。因此,在這種情況下,每個查詢一個天真的解決方案在O(sqrt(N))工作。

D <= sqrt(N)。最多有sqrt(N)這樣不同的D's。讓我們重複它們。對於固定值d,我們可以計算線性時間內所有if[i] = max(a[i], f[i - d])(邊界條件需要正確處理)。所有查詢的答案爲(X, D),其中D = d只是f[X]

總時間複雜度爲O((N + Q) * sqrt(N))。該解決方案使用線性空間量。

+0

在執行sqrt分解時,所有帶有塊的元素都不需要包含在查詢的子數組中,因此如何將塊中的最大元素數保存在塊中,因爲塊內的最大元素基於' D' – DreamWorks

+0

@DreamWorks數組不分塊。查詢(基於他們的'D'的值)。 – kraskevich

+0

你可以提供一個sudo代碼,它會更清楚 – DreamWorks