Kadane のアルゴリズムは、現在のポイントで終了するシーケンスの最大値と、これまでに確認された最大値を追跡します。
ウィキペディアのページに基づく Python 実装を次に示します。
def kadane(A):
max_ending_here = max_so_far = 0
for x in A:
max_ending_here = max([x,0,max_ending_here+x])
max_so_far = max(max_so_far,max_ending_here)
return max_so_far
2 つの変数を追加することで、このようなシーケンスの数を追跡するようにアルゴリズムを変更できます。
- count_with_max_ending_hereは、合計が max_ending_here になる値で、現在のポイントで終了するシーケンスの数をカウントします
- count_with_maxは、これまでに見つかったシーケンスの数を最大値でカウントします
Kadane のアルゴリズムは、O(n) の複雑さを維持しながら、これらの変数を追跡するように簡単に変更できます。
def kadane_count(A):
max_ending_here = max_so_far = 0
count_with_max_ending_here = 0 # Number of nontrivial sequences that sum to max_ending_here
count_with_max = 0
for i,x in enumerate(A):
new_max = max_ending_here+x
if new_max>=0:
if count_with_max_ending_here==0:
# Start a nontrivial sequence here
count_with_max_ending_here=1
elif max_ending_here==0:
# Can choose to carry on a nontrivial sequence, or start a new one here
count_with_max_ending_here += 1
max_ending_here = new_max
else:
count_with_max_ending_here = 0
max_ending_here = 0
if max_ending_here > max_so_far:
count_with_max = count_with_max_ending_here
max_so_far = max_ending_here
elif max_ending_here == max_so_far:
count_with_max += count_with_max_ending_here
return count_with_max
for A in [ [0,0,0,1],[0,0,0],[2,0,-2,2] ]:
print kadane(A),kadane_count(A)