[アルゴリズム]リング配列の中和値の最大サブセグメントを求める
6634 ワード
非環状配列について、和値の最大サブセグメントを解く方法は前の文章を参照する.
リング配列の場合、最大和値サブセグメントが先頭境界を越える場合を考慮する必要があり、解決方法は比較的簡単で、配列を2回処理する.サブセグメントの長さは配列全体の長さを超えてはならないことに注意してください.
注意:赤字部分は、リング配列を処理するために変更されたコードです.
リング配列の場合、最大和値サブセグメントが先頭境界を越える場合を考慮する必要があり、解決方法は比較的簡単で、配列を2回処理する.サブセグメントの長さは配列全体の長さを超えてはならないことに注意してください.
1 #! -*- coding: utf-8 -*-
2
3 loop = (4, -3, 2, -4, 1, 5, -3, -4, 3)
4 #loop = (4, 3, 2, 4, 1, 5, 3, 4, 3)
5 #loop = (-4, -3, -2, -4, -1, -5, -3, -4, -3)
6
7 #
8 # ,
9 # O(n)
10 # , ,
11 def big_sub():
12 try_sum = 0
13 try_start = 0
14 length = 0 #
15 try_length = 0 #
16
17 start = 0
18 end = 0
19 sum = 0
20 big = loop[0]
21 big_index = 0
22
23 for index in range(0, 2*len(loop)): #
24 i = index % len(loop) #
25
26 if try_sum >= 0:
27 try_sum += loop[i]
28 try_length += 1 #
29 if (try_sum > sum):
30 sum = try_sum
31 length = try_length #
32 if length >= len(loop): #
33 break #
34 end = i
35 start = try_start
36 else: # try_sum < 0
37 try_sum = loop[i]
38 try_start = i
39 try_length = 1 #
40
41 if loop[i] > big:
42 big = loop[i]
43 big_index = i
44
45 if sum == 0:
46 sum = big
47 start = end = big_index
48
49 if start <= end and length < len(loop): #
50 print loop[start:end+1],
51 elif length >= len(loop):
52 print loop,
53 else: #
54 print loop[start:],
55 print loop[:end+1],
56 print sum
57
58
59 big_sub()
注意:赤字部分は、リング配列を処理するために変更されたコードです.