デザインとアルゴリズムの分析 - リニア時間選択

 

 

プライベート 静的同等(int型の P、int型の R、int型K)
{ 
    場合(pが== R)
    { 
        戻り[P]を。
    } 
    int型 I = randomizedaparttition(P、R)。
    int型 J = I-P + 1; // [P:I]中元素的个数
    場合(K <= j)は
    { 
        返すrandomizeSelect(P、I、K)を、
    } 
    
    { 
        戻り randomizeSelectを(I + 1、R、K- J)。
    } 
}

 

 

 

 

このグループ内の2つの要素が各グループの中央値未満であるため、識別された基準は、少なくともX /要素10は、3(N-5)よりも大きい場合、中央値は1/2 * [N / 5- 1] = (N-5)/ 10、即ち、小さな別の(N-5)/ 10 X基準で1のN / 5桁。
同様に、参照は、少なくともX / 3未満(N-5)10個の要素です。場合n≥75、3(N-5) / / 410≥n ので、2つの部分をクリックし、得られた参照配列の長さは、少なくとも1/4、より短いとに分割されていること。
これは実際に理解することが容易である:
n個の要素CCP、5つの要素の組の配列は、約M = N / 5基の合計に分かれ。各グループのミドルサイズの数は、それを呼び出したいことがあり、「時間の中央値。」
次いで、アレイ全体のXの中間値M = N / 5番目の「サブメディアン」、「中央値」であり、削除
明らかに、「メジアン回」の約半分はXよりも小さい[(N-5)/ 10 < M / 2 ]
これらのグループでは、各要素が少なくとも3(S'時間の中央値である必要があります番号「もカウント)が、Xよりも小さい場合
、アレイ全体は、少なくともなければならないので、3(N-5)/ 10の要素はXよりも小さいです
場合3(N-5)/10≥nn≥75 / 4、 すなわちXより元素の少なくとも四半期小さいと言うことです
同様に、少なくとも、要素の四半期より大きなXより
最長の配列の分割全体をより均等に分割され、元の3/4を超えない後これは、中央値選択が妥当であることを保証します。
あなたはグレード10クラス、各クラスのみ5人を持っていると仮定します。
特定の試験は、あなたが第三位(期間の中央値)で、あなたのクラスをテストします。
各クラス3位は、あなたが10人(中央値)で5位にランク、それらを一緒に入れました。
それは年間を通じてあなたよりも少なくとも15の個々のスコアが低いほどがある、と言うことではないでしょうか?

 

プライベート 静的匹敵SELECT(INT P、INT R&LT、INT K)
{ 
    IF(RPは<5。 
    { 
        バブルソート(P、R&LT); // 単純なアルゴリズムを持つ配列を[P:r]をソートするソート
        戻り [Pを1-K + ]; 
    } 
    //は[P + 5 * i]の[P + 5 * I +になり 4] 及び第三小要素[P + I]交換部位
     // 中央値を見つけます。中央値は、RP-4述べすなわち上記5-N-。
    ためのint型 I = 0;私は=(4-RP)/を<5; Iは++ 
    { 
        int型 S. 5 * = P + I;
         INT T = S + 。4 ;
         のためのINT J = 0; J <3; J ++
        { 
            バブル(S、T - J)
        } 
        MyMath.swap(P + I、S + 2 )。
    } 
    同等のx =選択(P、Pの+(RP-4)/ 5(RP + 6)/ 10 )。
    INT I = パーティション(P、R、X)。
    int型 J = I-P + 1 ;
    もし(K <= J)
    { 
        リターン(P、I、K)を選択します。
    } 
    
    { 
        返す(K-、R、I + 1 [ j)は、
    } 
}

 

 

おすすめ

転載: www.cnblogs.com/wkfvawl/p/11517586.html