隨機生成一些數字並傳入某個方法。編寫一個程序,每當收到新字符數字時,找出並記錄中位數。

相似:設計一個數據結構,包括兩個函數,插入數據和得到中位數

解法:數據結構

一種解法是使用兩個優先級堆:一個大根堆,存放小於中位數的值,以及一個小根堆存放大於中位數的值。這會將全部元素大體分爲兩半,中間的兩個元素位於兩個堆的堆頂。這樣一來,要找到中位數就是小事一樁。dom

不過,「大體分爲兩半」又是什麼意思呢?「大體」的意思是,若是有奇數個值,其中一個堆就會多一個值。經觀察可知,如下兩點爲真。函數

若是maxHeap.size()>minHeap.size(),則maxHeap.top爲中位數。spa

若是maxHeap.size()==minHeap.size(),則maxHeap.top()和minHeap.top()的平均值爲中位數。設計

當要從新平衡這兩個堆時,咱們會確保maxHeap必定會多一個元素。get

複製代碼

//老是保證大根堆的元素大於等於小根堆的
void addNewNumber(int randomNumber)
{
//當大根堆的元素和小根堆的元素相等時
    if(maxHeap.size()==minHeap.size())
    {
        if((minHeap.peek()!=NULL&&randomNumber>minHeap.peek())//此時應該將元素插入小根堆,可是要保證大根堆的元素大於等於小根堆,因此將小根堆這最小的元素插入大根堆,而後將該元素插入小根堆
                maxHeap.offer(minHeap.poll());
                minHeap.offer(randomNumber);
            }
            else
            {
                maxHeap.offer(randomNumber);
            }
    }
    else //大根堆的元素大於小根堆,直接將元素插入小根堆
    {
        if(randomNumber<maxHeap.peek())
        {
            minHeap.offer(maxHeap.poll());
            maxHeap.offer(randomNumber);
        }
        else
        {
            minHeap.offer(randomNumber);
        }
    }
}

double getMedian()
{
    if(maxHeap.isEmpty())
    {
        return 0;
    }
    if(maxHeap.size()==minHeap.size())
    {
        return (double)(minHeap.peek()+maxHeap.peek())/2;
    }
    else
        return maxHeap.peek();
}

複製代碼

相關文章
相關標籤/搜索