演算法題 中位數問題

2021-10-02 00:19:05 字數 1217 閱讀 8959

平時我們要找中位數還得排一下序,但是如果掌握了堆這乙個結構。我們就只需要乙個大頂堆和乙個小頂堆就可以了。大頂堆和小頂堆的性質不贅述,但是乙個比較重要的提一下,就是大頂堆堆頂是整個堆的最大值,小頂堆的頂必然是最小值。並且我們要實現的中位數的演算法,還需要保證小頂堆的最小值大於大頂堆的最大值。

1、有了這一性質,我們能幹嘛呢,我們就可以通過這兩個堆來操作,首先是建堆的過程。

對於一組資料,用流的形式做比喻,乙個資料來到,我們看看我們此時的兩個堆都沒有資料,那麼我們隨便放乙個,比如我們放大頂堆。

2、這時候第二個資料來了,我們就開始判斷。如果此時這個資料小於大頂堆的堆頂,那我們就要放到大頂堆裡面去,反之就放在小頂堆裡面,總之保證大頂堆全部小於小頂堆。但這不算完,因為此時大頂堆兩個數了,我們得平衡兩邊,那我們只需要把大頂堆的堆頂放到小頂堆的堆底就行了。這樣就可以不破壞兩堆大小關係的同時完成數目的平衡。

3、這時候兩堆都有乙個數了,後面的數其實也是一樣的,先判斷的大小,該放到**,再看是否平衡,不平衡就弄平衡。原理都是一樣的。這樣一來,兩堆的堆頂恰好就是中間的兩個數了(大家思考一下~)。

整個思路就是這樣,下面上**

#include

using namespace std;

//實際上大頂堆和小頂堆只相差符號,但是為了省事我這裡就直接拷貝了兩份

void

maxheapinsert

(int a,

int index,

int num)

}void

minheapinsert

(int a,

int index,

int num)

}void

maxheapify

(int a,

int n,

int size)

}void

minheapify

(int a,

int n,

int size)

}int

main()

else

}//放在大頂堆的情況

else

else}}

for(i=

0;i) cout<<<

" ";

cout

0;i) cout<<<

" ";

//得到中位數。。。

}

splay入門題 中位數

mid description 維護乙個集合,有2種操作 1.每次可以插入乙個元素。2.找出當前集合中第 n 1 2 大的元素,把它輸出,然後把它從集合中刪除。n 100000 input 第1行乙個數n,表示由n次操作。接下來n行。每行第1個數c表示操作型別。1.c 1,接下來還有乙個數,表示要插...

Vijos 1549題 中位數

給出1 n的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是b。中位數是指把所有元素從小到大排列後,位於中間的數。輸入格式 第一行為兩個正整數n和b 第二行為1 n 的排列。輸出格式 輸出乙個整數,即中位數為b的連續子串行個數。樣例輸入1 5 4 1 2 3 4 5樣例輸出1 2樣例輸入...

演算法 動態中位數問題

輸入一組整數a1,a2,an 每輸入乙個整數,輸出到此時為止的中位數。中位數定義 如果數串的大小是偶數 2j,中位數是從小到大排列的第 j 個數 如果數串的大小是奇數 2j 1,中位數是從小到大排列的第 j 1 個數。一組整數,數字和數字之間以空格隔開。一組整數,數字和數字之間以空格隔開。最後乙個數...