[英]kth order statistic in range [i, j]
有一個問題,但我找不到一個有效的算法。
給定一個數組a[1], ..., a[n]
,我們得到這種類型的查詢:
SELECT(i, j, k)
:在排序a[i], a[i+1], ..., a[j]
之后找到范圍[i,j]中的第k個最小數字 SET(i, value)
:執行a[i] = value
輸入:
5 5 // n = 5 (size of array), m = 5 (number of query)
5 10 9 6 7
select 2 4 1
select 2 4 2
set 3 12
set 4 15
select 2 4 1
輸出:
6
9
10
我認為我們可以使用Merge Sort Tree
( Special segment tree
)來實現它。 我在互聯網上找到了這個: 合並排序樹,用於范圍訂單統計
但是因為我們可以改變數組值,這個算法效率不高。
是否有可能幫助我,我該如何有效地實施它?
謝謝。
我不知道合並排序樹,但我可以想到不同的數據結構/算法,它為每個查詢提供O(n)
的期望輸出。
注意這個問題的解決方案取決於SET
和SELECT
查詢之間的分配 - >我假設有更多的SELECT
,所以我試圖降低這種復雜性。 如果你有更多SET
,那么我會使用@miradham回答:
david miradham
SET O(n) O(1)
SELECT O(n) O(nlogn)
Space O(n) O(n)
兩種解決方案都是O(n)
空間復雜度。
在您的問題中,您使用從1開始的索引 - >我將其修改為從0開始。
讓我們看看你的例子: a = array (5, 10, 9, 6, 7)
。 作為預處理,我們將創建排序數組,其中還包含元素的原始索引 - > b = array(5(0), 6(3), 7(4), 9(2), 10(1))
時括號中的數字是原始數組中的索引a
。 這可以在O(nlogn)
。
我們如何處理查詢?
SELECT(i,j,k) :
let cnt = 1;
for m in b (sorted array)
if m(index) <= i && m(index) <= j // the index is in given range
if (cnt == k)
return k // found the k lowest
else cnt++
當你循環遍歷b
這是O(n)
SET(i,value) :
更改a
很容易,可以在O(1)
。 改變b
:
originalValue = a[i] // old value
Add [value(i)] to b as new element // O(logn) as b sorted
Remove [originalValue(i)] from b // b sorted but array implementation may cause O(n)
O(n)
總數
如果需要進一步說明,請隨意詢問。 希望有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.