そして、最大のサブシーケンスを見つけます

問題:

  • 最大のシーケンスおよび簡単な計算のための、ときサブシーケンスと負の時間を見つけるために、データのセット、データの集合を考えると、0に設定されています。
  • 例えば、与えられたデータは、からなる最大のサブシーケンスと4-35-2-126 11で4-35-2-126-2、あります

分析:

  • 最初のアカウントにすべてのサブシーケンスの場合、口座にそれは複雑さO(n³)に達する時間を割いを取って、最適化はO(n²)に達した後も、捨て、最も簡単な横断方法を検討してください。
  • この問題のために、被験体に、すなわち分析のために、分割統治アプローチを検討することである:データのセット及び対応する配列は、元のデータの左半分に起こる最大サブも右半分側に表示されることがあり、それも可能です一緒に左右の組み合わせの各部分(2つの部分は一緒に接続されなければなりません)。

アルゴリズム設計:

  • 最初にすべてのデータの左右の部分に、分割統治のアルゴリズム戦略を取り、再帰的に約2の部分の最大値を見つけます。
  • 左右の添え字に配列を通過させることにより、左右の部品を制御するために制御するように機能します。
  • すなわち、一方のみのデータ配列への再帰的なデータは、左のインデックスは、目標場合、戻りデータの右に等しい場合。最大値がシーケンスの途中で発生するためと、最初の必要性は、最大のサブループ配列は、それらの添加後に、最初のデータの最大サブ権利を見つけた後、左及び最後のデータを含み、検索します。最後に、3例を比較し、最大値を戻すことができます。
  • サブシーケンスと負、及び処理のために0である場合のことに注意してください。

コード:

int MaxSubSum(int A[],int Left,int Right)
{
    if(Left==Right)
    {
        if(A[Left]>0)
            return A[Left];
        else
            return 0;
    }
    int MaxLeftSum,MaxRightSum;
    int MaxLeftBorderSum,MaxRightBorderSum;
    int LeftBorderSum,RightBorderSum;
    int Center,i;

    Center = (Left+Right)/2;
    MaxLeftSum = MaxSubSum(A[],Left,Center);
    MaxRightSum = MaxSubSum(A[],Center+1,Right);
    
    MaxLeftBorderSum = 0;
    LeftBorderSum = 0;
    MaxRightBorderSum = 0;
    RightBorderSum = 0;
    for(i=Center;i>=Left;i--)
    {
        LeftBorderSum += A[i];
        if(LeftBorderSum>MaxLeftBorderSum)
            MaxLeftBorderSum = LeftBorderSum;
    }
    for(i=Center+1;i<=Right;i++)
    {
        RightBorderSum += A[i];
        if(RightBorderSum>MaxRightBorderSum)
            MaxRightBorderSum = RigthBorderSum;
    }
    return Max(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum);

時間複雑

  • O(N logN個)==>あなたがたは証明し忘れなど見直しへの裏に、そしてそこにそれを追加

おすすめ

転載: www.cnblogs.com/cyh-blackhouse/p/12420955.html