[スピーキングアルゴリズムスモールクラス]分割統治法を使用して、最大の連続サブシーケンスの合計を求めます

分割統治法を使用して、最大の連続サブシーケンスの合計を見つけます

整数列a [n]、1≤s、t≤nを設定します。サブシーケンスの合計ができるだけ大きくなるように、a [n]のサブシーケンスa [s、t]を見つけます。
この合計が0未満の場合、0が出力されます。

[アルゴリズムオントロジー]

(参照コードでは、実行時間がブルートフォース方式と比較されるため、ブルートフォース方式ではプレフィックス合計が使用されます。便宜上、配列の添え字は1から始まります)
Set m = floor((s + t)/ 2) 。
n = 1の場合、結果として唯一の要素が直接取得されます。要素が負の場合、0が出力されます。
n> 1の場合、議論は3つのケースに分けられます。
[ケース1]サブシーケンスは完全に元のシーケンスa [s、m]の左半分にあります。シーケンスa [s、m]の最大の連続サブシーケンスの合計を再帰的に見つけます。
[ケース2]サブシーケンスは完全に元のシーケンスa [m + 1、t]の右半分にあります。シーケンスa [m + 1、t]の最大の連続サブシーケンスの合計を再帰的に見つけます。
[ケース3]このサブシーケンスは左右にまたがっているため、[ケース1]と[ケース2]の再帰的解法アルゴリズムでは、このような連続サブシーケンスの最大合計を見つけることができません。このタイプのサブシーケンスの場合、この連続サブシーケンスの最大合計を取得するには、中間点mから開始し、シーケンスの両端の両側に各要素を追加するだけで済みます。
最後に、3つのケースで得られた連続するサブシーケンスの合計について、最大のものが最終結果として選択されます。

【時間計算量】

このアルゴリズムでは、最大の連続サブシーケンスの合計が長さnのシーケンスに対して計算される場合、長さn / 2の2つのサブシーケンスを再帰的に解く必要があり、再帰的な解を得ることができません。左半分と右半分を考慮に入れます。のサブシーケンスを解きます。したがって、
T(1)= O(1)、n = 1
T(n)= 2T(1/2 n)+ O(n)、n> 1は
T(n)= O(n log n)を解きます。
ブルートフォースアルゴリズムとの比較:ブルートフォースアルゴリズム
のプロセスは、最初に元の配列のプレフィックス合計(最初のn項目の合計)を計算し、次に
S_n-S_(n-1)= a_nを使用してS_nを
列挙ます。 S_(n-1)は、すべての連続サブシーケンスの合計を調べます。時間計算量はO(n ^ 2)です。
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/COFACTOR/article/details/108691530