LeetCode:方法bioheapデータストリームの295ビット

中央値は、順序付けられたリストの真ん中の数です。リストの長さが偶数の場合、中央値は、2つの中間の数値の平均値です。

例えば、
[2,3,4]の中央値は3である
[2,3]中央値は(2 + 3)/ 2 = 2.5であります

次の2つの動作をサポートするように設計されたデータ構造:
ボイドaddNum(int型NUM) -整数のデータストリームからのデータ構造を追加します。
ダブルfindMedian() -すべての要素の現在の中央値を返します。

例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

高度:
データは0〜100の範囲内の全ての整数でストリーミングした場合、どのようにあなたのアルゴリズムを最適化するのでしょうか?
整数データをストリーミングした場合、99%はあなたのアルゴリズムを最適化する方法を、0〜100の範囲内にありますか?

出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/find-median-from-data-stream:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

思考

Bioheap法:
[ STLヒープ上 ]
大ヒープビッグトップと小さなトップヒープ小さな、記憶素子を使用して、それらを満たすを作ります

  • スタックの最上部は、(最小最大未満の左右小のスタックの大きい上部よりも小さくなっています
  • 小さなヒープ内の要素以上、1の数に大きな差

[ヒープ内の要素の大小数の場合]との差が複数の挿入要素で発生した場合、複数の要素を積層する必要が新しいヒープ少ないスタック要素の上部を作るために、スタックの最上部に移動し、同様のAVL木

我々は常に意図的に、かつ簡便に(ヒープの原因である)新しい要素の大きな山が上部よりも大きい左、どちら側に挿入されるべき新しい要素を決定するために、両側の最大/最小値を取るように、その後、小さなに挿入ヒープ、およびその逆

  1. 2つのスタックの要素数とは、自然2に応じて、両側に、彼らは同じ数の要素を持っているにもされている場合は、平均的には、スタックの最上部に大きなスタックの最上部の中央値と小さいです
  2. 2つのスタックの要素数とは、奇数である場合、スタックのスタックの最上位に位置する要素の中央値

コード

class MedianFinder {
public:
    vector<int> big;
    vector<int> small;
    /** initialize your data structure here. */
    MedianFinder()
    {
        
    }
    
    void addNum(int num)
    {
        int lmax = (big.size()==0)?(INT_MAX):(big[0]);
        if(lmax<num)
        {
            small.push_back(num);
            push_heap(small.begin(), small.end(), greater<int>());
        }
        else
        {
            big.push_back(num);
            push_heap(big.begin(), big.end(), less<int>());
        }
        if(fabs(big.size()-small.size())>1)
        {
            if(big.size()>small.size())
            {
                small.push_back(big[0]);
                push_heap(small.begin(), small.end(), greater<int>());
                pop_heap(big.begin(), big.end(), less<int>());
                big.pop_back();
            }
            else if(small.size()>big.size())
            {
                big.push_back(small[0]);
                push_heap(big.begin(), big.end(), less<int>());
                pop_heap(small.begin(), small.end(), greater<int>());
                small.pop_back();
            }
        }
    }
    
    double findMedian()
    {
        if((big.size()+small.size())%2==0)
            return (double)(big[0]+small[0])/2;
        return (big.size()>small.size())?(big[0]):(small[0]);
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */
公開された170元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_44176696/article/details/104610237