戦略
次の線形時間アルゴリズムは、部分和の符号に基づいて正または負の数を選択することにより、中心にホバリングする戦略を採用しています。数字のリストを前処理します。加算を実行しながら、入力の順列をオンザフライで計算します。0
アルゴリズム
- を、正の要素と負の要素 2つのリストに分割します。ゼロは除外できます。 P Ma1、… 、anPM
- してみましょう。Su m = 0
- 両方のリストは空ではありませんが
- もし {。 ; }S u m := S u m + 頭(M )M := 尾(M )Su m > 0Su m := Su m + 頭(M)M:=テール(M)
- else { ; ; }P := tail (P )Su m := Su m + 頭(P)P:=テール(P)
- 2つのリストのいずれかが空になったら、残りのリストの残りをに追加します。S
正しさ
正しさは、数字のリストの長さに関する簡単な帰納的引数を使用して確立できます。
まず、がすべて正(またはすべて負)であり、それらの合計がオーバーフローを引き起こさないか、接頭辞の合計も行わないことを証明します。これは簡単です。a1、… 、an
次に、が範囲内であることをアルゴリズムのループの不変式であることを証明します。明らかに、ように、これはループに入るときに当てはまります。さて、あれば、の範囲内にある負の数の追加しない原因範囲外行くことを。同様に、合計に境界内にある正の数を追加することが発生しない境界の外出します。したがって、ループを終了すると、は範囲内になります。SU メートルSu m = 0Su m > 0SU メートルSU メートルSU M ≤ 0SU メートルSU メートル
これで、最初の結果を適用できます。これらを合わせることで、合計が範囲外にならないことを証明できます。