1
package com.ibm.nicky.maxsegment;
2
3
/**
4
* @author QuQiang
5
*
6
* The program can calculate the max sum segment
7
* source[i]+source[i+1]+…+source[j]in source array,and return the
8
* position.Ignore the zero position.
9
*/
10
public class MaxSegment {
11
12
/**
13
* if start = -1 end = -1 is returned, the array should be initialized
14
*/
15
private static int start = -1;
16
private static int end = -1;
17
private static int sum = 0;
18
19
private static int[] source = {-1,-2,-1,-10,-3,0,2,6,12,-5,6,-4};
20
21
/*
22
* The main function to test the method.
23
*/
24
/* public static void main(String[] args) {
25
System.out.println(MaxSegment.getThrOptimizedMaxSegment()
26
+ ":" + MaxSegment.start + ":" + MaxSegment.end);
27
}*/
28
29
/**
30
* @return the sum of the max segment but the method is not very nice. the
31
* algorithmic complexity is T(n)=O(n^3)
32
*/
33
public static int getMaxSegment() {
34
start = -1;end = -1;sum = 0;
35
for (int i = 0; i < source.length; i++) {
36
for (int j = i + 1; j < source.length; j++) {
37
int temp = 0;
38
for (int k = i; k < j; k++) {
39
temp += source[k];
40
}
41
if (temp > sum) {
42
sum = temp;
43
start = i;
44
end = j - 1;
45
}
46
}
47
}
48
return sum;
49
}
50
51
/**
52
* @return the sum of the max segment && use the previous result
53
* sum[i+1]=sum[i]+source[i+1]. algorithmic complexity is (n)=O(n^2)
54
*/
55
public static int getFirOptimizedMaxSegment() {
56
start = -1;end = -1;sum = 0;
57
for (int i = 0; i < source.length; i++) {
58
int temp = 0;
59
for (int j = i; j < source.length; j++) {
60
temp += source[j];
61
if (temp > sum) {
62
sum = temp;
63
start = i;
64
end = j;
65
}
66
}
67
}
68
return sum;
69
}
70
71
/**
72
* @return the sum of the max segment && use the recursion
73
* formula.Division-and-Conquer and Recursion algorithm algorithmic
74
* complexity is T(n)=2T(n/2)+O(n),T(n)=O(nlogn).
75
*/
76
public static int getSecondOptimizedMaxSegment(int leftend, int rightend) {
77
start = -1;end = -1;sum = 0;
78
int centerpiont = 0, leftsum = 0, rightsum = 0;// ,tempstart = -1
79
// ,tempend = -1;
80
if (leftend == rightend)
81
sum = source[leftend] > 0 ? source[leftend] : 0;
82
else {
83
centerpiont = (leftend + rightend) / 2;
84
leftsum = getSecondOptimizedMaxSegment(leftend, centerpiont);
85
rightsum = getSecondOptimizedMaxSegment(centerpiont + 1, rightend);
86
}
87
int templeftSum = 0, lefts = 0;
88
for (int i = centerpiont; i > leftend - 1; i--) {
89
lefts += source[i];
90
if (lefts > templeftSum) {
91
templeftSum = lefts;
92
// tempstart = i;
93
start = i;
94
}
95
}
96
int temprightSum = 0, rights = 0;
97
for (int j = centerpiont + 1; j < rightend + 1; j++) {
98
rights += source[j];
99
if (rights > temprightSum) {
100
temprightSum = rights;
101
// tempend = j;
102
end = j;
103
}
104
}
105
sum = templeftSum + temprightSum;
106
if (sum < leftsum) {
107
start = leftend;
108
end = centerpiont;
109
return sum = leftsum;
110
} else if (sum < rightsum) {
111
start = centerpiont + 1;
112
end = rightend;
113
return sum = rightsum;
114
} else {
115
// start = tempstart ;
116
// end = tempend;
117
return sum;
118
}
119
}
120
121
/**
122
* @return the sum of the max segment && use the dynamic programming
123
* (DP).temp[i]=max(temp[i-1]+source[i],source[i]) algorithmic
124
* complexity is O(n).(Not all are negative)
125
*/
126
public static int getThrOptimizedMaxSegment() {
127
start = -1;end = -1;sum = 0;
128
int temp = 0;
129
int flag=-1, count=0;
130
for (int i = 0; i < source.length; i++) {
131
if (temp > 0){
132
temp += source[i];
133
flag = i;
134
count++;
135
}
136
else
137
temp = source[i];
138
if (temp > sum){
139
sum = temp ;
140
start = flag-count;
141
end = i;
142
}
143
}
144
return sum;
145
}
146
147
public static int getStart() {
148
return start;
149
}
150
151
public static int getEnd() {
152
return end;
153
}
154
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154
