問題:
- 最大のシーケンスおよび簡単な計算のための、ときサブシーケンスと負の時間を見つけるために、データのセット、データの集合を考えると、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個)==>あなたがたは証明し忘れなど見直しへの裏に、そしてそこにそれを追加