Basic python
Basic python
X = [ 31, -41, 59, 26, -53, 58, 97, -93, -23, 84]
2 6
= X[2 : 7]
CCE20003 HGU
Observations
X = [, , ….. ,
Basic idea
For all possible subsequences, find their sums and
compare the results to choose the subsequence
with
the maximum sum.
Pseudo code
n + (n – 1) + …… + 1 =
L U
∴ subsequences
0 1 X[0 : 1]
n ..…. ………….
How to enumerate?
Nested loop.
n X[0 : n]
1 2 X[1 : 2]
for L in range(n):
n-1 ..…. ………...
for U in range(L+1, n+1):
n X[1 : n]
…. ..…. …………. What to do here?
CCE20003 HGU
Performance Analysis
n = len(X)
MaxSoFar = 0
for L in range(n):
for U in range(L+1, n+1): Why?
sum= 0
for i in range(L, U): Computing the sum of
sum = sum + X[i] X[L, U]
n = len(X)
MaxSoFar = 0
for L in range(n): n(n + 1) / 2
for U in range(L+1, n+1): subsequences
sum = 0
for i in range(L, U):
sum = sum + X[i]
At most n - 1 addi-
if MaxSoFar < sum:
tions
MaxL, MaxU, MaxSoFar = L, U, for a subsequence
sum
CCE20003 HGU
Observation
n = len(X)
MaxSoFar = 0
This many additions
for L in range(n):
needed?
X[L : L+1] : 0 addition
for U in range(L+1, n+1): …………………...
sum = 0 X[L : k] : k - L - 1 addi-
tions
for i in range(L, U): X[L : k + 1] : k - L addi-
sum = sum + X[i] tions
if MaxSoFar < sum: …………………….
X[L : n] : n - L - 1 additions
MaxL, MaxU, MaxSoFar = L, U, sum
INCREMENTAL COMPUTATION CCE20003 HGU
X[L : k] : k - L - 1 additions
X[L : k + 1] : k – L additions
n = len(X)
MaxSoFar = 0
for L in range(n):
for U in range(L+1, n+1):
sum = 0
for i in range(L, U): sum = sum + X[U-1]
sum = sum + X[i]
if MaxSoFar < sum:
MaxL, MaxU, MaxSoFar = L, U, sum
CCE20003 HGU
n = len(X)
MaxSoFar = 0
for L in range(n):
sum = 0
for U in range(L+1, n):
sum = sum + X[U-1]
if MaxSoFar < sum:
MaxL, MaxU, MaxSoFar = L, U, sum
O() additions !
DIVIDE AND CONQUER CCE20003 HGU
Basic Idea
m = (L + U) / 2
MaxX = max(MaxL, MaxR, MaxM)
CCE20003 HGU
L m+ U
m
1 MaxMR
MaxML
O(n)
time
CCE20003 HGU
[ 31, -41, 59, 26, -53, 58, 97, -93, -23, 84]
[ 31, -41, 59, 26, -53][58, 97, -93, -23, 84]
[ 31, -41][59, 26, -53][58, 97][-93, -23, 84]
[ 31, -41][59, 26, -53][58, 97][-93, -23, 84]
[ 31][-41][59][26, -53][58][97][-93][-23, 84]
[26][-53] [-23][84]
n/ =1 k = rounds
∴ O(n
DYNAMIC PROGRAMMIMG CCE20003 HGU
Basic idea
X[0:i+1]
X[0:i]
MaxSo-
MaxTail
Far
MaxSoFar: The sum of the maximum subsequence in
X[0 : i]
MaxTail : The sum of the maximum subsequence that
ends at X[i-1]
Given MaxSoFar and MaxTail for X[0 : i], how can we
find those for X[0 : i+1} ?
CCE20003 HGU
Recursive equations
MaxTail[i] max(0, X[0]) if i = 0
= max(0, MaxTail[i-1] + X[i]), otherwise
def max_sub(X):
MaxTail = 0
MaxSoFar = 0
for i in range(len(X)):
MaxTail = max(0, MaxTail + X[i])
MaxSoFar = max(MaxSoFar, MaxTail)O(1) time
return MaxSoFar
O(n) time
CCE20003 HGU