Skip to content

Instantly share code, notes, and snippets.

@butaji
Created October 2, 2011 18:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save butaji/1257729 to your computer and use it in GitHub Desktop.
Save butaji/1257729 to your computer and use it in GitHub Desktop.
maximum subarray of currency usd to rub for 5 years
import csv
def find_crossing(a, low, mid, high):
max_left = 0
max_right = 0
left_sum = -1e308
sum = 0
for i in range(mid, low, -1):
sum = sum + a[i][1]
if sum > left_sum:
left_sum = sum
max_left = i
max_right = 0
right_sum = -1e308
sum = 0
for j in range(mid + 1, high):
sum = sum + a[j][1]
if sum > right_sum:
right_sum = sum
max_right = j
return max_left, max_right, left_sum + right_sum
def find_max_subarray(a, low, high):
if high == low:
return low, high, a[low][1]
else:
mid = (low + high) / 2
left_low, left_high, left_sum = find_max_subarray(a, low, mid)
right_low, right_high, right_sum = find_max_subarray(a, mid + 1, high)
cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
if (left_sum >= right_sum) & (left_sum >= cross_sum):
return left_low, left_high, left_sum
elif (right_sum >= left_sum) & (right_sum >= cross_sum):
return right_low, right_high, right_sum
else:
return cross_low, cross_high, cross_sum
courses = []
reader = csv.reader(open('data.csv', 'rb'), delimiter=',', quotechar='"')
prev = 0
for row in reader:
cur = float(row[1])
if prev == 0:
prev = cur
value = [row[0], prev - cur, row[1]]
prev = cur
courses.insert(0, value)
min, max, sum = find_max_subarray(courses, 0, len(courses)-1)
print courses[min]
print courses[max]
print sum
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment