簡體   English   中英

范圍[i,j]中的第k階統計量

[英]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 TreeSpecial segment tree )來實現它。 我在互聯網上找到了這個: 合並排序樹,用於范圍訂單統計

但是因為我們可以改變數組值,這個算法效率不高。
是否有可能幫助我,我該如何有效地實施它?
謝謝。

我不知道合並排序樹,但我可以想到不同的數據結構/算法,它為每個查詢提供O(n)的期望輸出。

注意這個問題的解決方案取決於SETSELECT查詢之間的分配 - >我假設有更多的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM