的所有連續子陣列讓我們定義一個大小爲K
的數組B[1:K]
的運算,即計算子陣列B[2:K]
中小於B[1]
的元素數。查詢大小爲K
現在我有一個大小爲N
的數組A[1:N]
,我的目標是對大小爲K
的所有連續子數組執行上述操作。
例
A = [4, 3, 6, 2, 1] and K = 3
有很多3
大小的3
鄰接子陣列。
B = [4, 3, 6]
count = 1
[(3 < 4)]
B = [3, 6, 2]
count = 1
[(2 < 3)]
B = [6, 2, 1]
count = 2
[(2 < 6), (1 < 6)]
蠻力方法的時間複雜度將是O((N-K+1)*K)
由於在尺寸的連續子陣列執行上述操作K
是O(K)
。
我能做到在Nlog(M)
有效,即如果我可以設計,其具有以下性質
- 插入在比
X
較小的元素的log(M)
- 缺失在
log(M)
- 計數數目的數據結構 在
log(M)
我是C++
用戶,我不認爲有任何數據結構可以滿足所有提及的要求。還有其他方法可以改進嗎?請幫忙。
前兩個是'std :: set',但最後一個操作是'O(M)',儘管事實上找到上限是'O(logM)'本身。 – StoryTeller
如果你的目標只是數我有一個算法在O(nlogn)運行 – marvel308
@StoryTeller是的,我知道這一點。 – cryptomanic