動態維護中位數用到了對頂堆,乙個大根堆乙個小根中位數在中間;在維護乙個整數序列時,需要在游標處改變值,都是在數列之間的某一位置進行操作,就想能不能像對頂堆那樣分為前後兩部分求呢,但是數列順序不能改變只是增刪和求字首和,因為只對游標前面的元素操作說白了就是對游標前面的數列操作,並且增刪只在最後一項嗎,這就很自然的讓我們想到了棧這種結構。
動態維護中位數:
依次讀入乙個整數序列,每當已經讀入的整數個數為奇數時,輸出已讀入的整數構成的序列的中位數。
在開始時,序列是空的。
1、「i x」,在游標處插入數值x。
2、「d」,將游標前面的第乙個元素刪除,如果前面沒有元素,則忽略此操作。
3、「l」,將游標向左移動,跳過乙個元素,如果左邊沒有元素,則忽略此操作。
4、「r」,將游標向右移動,跳過乙個元素,如果右邊沒有元素,則忽略次操作。
5、「q k」,假設此刻游標之前的序列為a1,a2,…,ana1,a2,…,an,輸出max1≤i≤ksimax1≤i≤ksi,其中si=a1+a2+…+aisi=a1+a2+…+ai。
對頂堆的故事
總結 用大頂堆和小頂堆來實現,控制兩個堆的個數來實現將第幾個數暴露在兩個堆的中間,這樣就可以隨時輸出第幾個數,隨意以乙個頂堆的top 為標準,判斷下乙個數加在哪個堆裡,並時刻控制數量,這樣就可以將要求的第幾個數一直存疑兩個頂堆的top 之間。include include using namespa...
對頂堆,求第K大的數
對頂堆,顧名思義就是兩個相對的堆。o logn 0即上方是乙個維護最小值的小根堆smheap,下方則維護最大值的大根堆bgheap。利用這樣的性質,我們就可以求中位數 動態維護k大值。優先佇列是用堆來實現的。思路 我們必須保證小根堆裡面的所有值是大於大根堆裡面所有值的 1.如果要插入的值x smhe...
C語言堆疊入門 堆和棧的區別 頂嵌原創
在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...