動態維護數列的中位數

2021-07-04 02:40:36 字數 504 閱讀 5820

** 

問題陳述:有個需要動態更新(插入或刪除)的數列l,現在需要隨時獲取到該數列的中位數,請設計相應的資料結構和演算法。

演算法:令l的中位數為m,用乙個大頂堆儲存數列l中不大於m的元素(即l按從小到大排列時的前半部分),用乙個小頂堆儲存數列l中不小於m的元素(即l按從小到大排列時的後半部分),其中這兩個大小頂堆均不包含中位數m。每次往數列l插入新元素x時,若x

分析:容易看出,以上演算法中,讀取當前中位數的時間複雜度為o(1),插入和刪除元素(包括調整堆)的時間複雜度為o(logn)。

發散:上述演算法可以推廣到解決維護數列的第k大(小)數的問題,只需要修改大、小頂堆的元素數目即可。

也可以用平衡樹外加乙個指標實時跟蹤中位數變化,也是可以做到插入o(logn),提取o(1)的。

維護動態區間的中位數

依次讀入乙個整數序列,每當已經讀入的整數個數為奇數時,輸出已讀入的整數構成的序列的中位數。詳細內容 最樸素寫法,每到奇數時位將前面所有資料排序,找到中位數 每次sort是 o nlog n 一組資料需要sort frac 次,所以複雜度為 o n 2log n include include usi...

動態中位數

178.動態中位數 統計描述 提交自定義測試 題目描述 輸入n個32位有符號整數,當已輸入的個數為奇數個時,輸出此時的中位數。輸入描述 第一行乙個整數n 第二行n個32位有符號整數。輸出描述 輸出一行,n 2 上取整 個中位數,中間用空格隔開。對於 40 資料 n 1000 對於所有資料 n 100...

動態中位數

依次讀入乙個整數序列,每當已經讀入的整數個數為奇數時,輸出已讀入的整數構成的序列的中位數。輸入格式 第一行輸入乙個整數p,代表後面資料集的個數,接下來若干行輸入各個資料集。每個資料集的第一行首先輸入乙個代表資料集的編號的整數。然後輸入乙個整數m,代表資料集中包含資料的個數,m一定為奇數,資料之間用空...