рдбреЙрд▓рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ "рдЕрдзрд┐рдХрддрдо-рд╕рдмрд░реЗрд░реА" рдХреА рд╕рдорд╕реНрдпрд╛

рд╕рд╛рд░ рдХреНрдпрд╛ рд╣реИ?


рдпрд╣ рдЖрд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ 5 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдбреЙрд▓рд░ / рд░реВрдмрд▓ рдХреА рд╡рд┐рдирд┐рдордп рджрд░ рдореЗрдВ рдЕрдВрддрд░ рд╕реЗ рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрдорд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЫрд╡рд┐
рд░реВрд╕реА рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд╛рдо рд▓рдЧрднрдЧ рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рд╕рдмрд░реНрд░реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЕрдзрд┐рдХрддрдо рдпреЛрдЧ рдХреА рддрд░рд╣ рд▓рдЧреЗрдЧрд╛ред рд▓реЗрдЦ рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рднреА рд╣реИред

рдЫрд╡рд┐
рдореИрдВ рдЗрд╕ рдкрд░ рдХреИрд╕реЗ рдЖрдпрд╛?

рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рд╕реАрдПрд▓рдЖрд░рдПрд╕ рдкреБрд╕реНрддрдХ ( рдереЙрдорд╕ рдПрдЪред рдХреЛрд░рдореЗрди, рдЪрд╛рд░реНрд▓реНрд╕ рдИред рд▓рд┐рд╕реЗрд░рд╕рди, рд░реЛрдирд╛рд▓реНрдб рдПрд▓ред рд░рд┐рд╡реЗрд╕реНрдЯ рдФрд░ рдХреНрд▓рд┐рдлреЛрд░реНрдб рд╕реНрдЯреАрди рдХреЛ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ ред рдЕрд▓реНрдЧреЛрд░рд┐рджреНрдо, рдерд░реНрдб рдПрдбрд┐рд╢рди рдХрд╛ рдкрд░рд┐рдЪрдпред )ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдкреБрд╕реНрддрдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рдореМрд▓рд┐рдХ рдЬреНрдЮрд╛рди рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддреА рд╣реИред
рдкреБрд╕реНрддрдХ рдХрд╛ рдПрдХ рднрд╛рдЧ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЬреНрдЮрд╛рди рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣рд┐рдд рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ 5 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд░реВрдмрд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рдбреЙрд▓рд░ рдХреА рд╡рд┐рдирд┐рдордп рджрд░ рдкрд░ рдбреЗрдЯрд╛ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░

рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ 5 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЧреНрд░рд╛рдл рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдбреЙрд▓рд░ рдмрд╣реБрдд рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдФрд░ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реМрджрд╛ рдПрдХ рдиреНрдпреВрдирддрдо рдиреНрдпреВрдирддрдо рдкрд░ рдЦрд░реАрджрдирд╛ рдФрд░ рдмрд╛рдж рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЕрдзрд┐рдХрддрдо рдкрд░ рдмреЗрдЪрдирд╛ рд╣реЛрдЧрд╛ (рдЬреЛ рдХрднреА-рдХрднреА "рдЖрдВрдЦ рд╕реЗ" рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛)ред

рдЫрд╡рд┐

рдЖрдЗрдП рдЗрд╕ рдХрдерди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред

рдирд┐рд░реНрдгрдп

рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди "рд╣реЗрдб-рдСрди рдЬрд╛рдирд╛" рд╣реЛрдЧрд╛ рдФрд░ рд╕рдмрд░реЗрдЬрд╝ рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдпреЛрдЧреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЦреЛрдЬреЗрдВ рдФрд░ рдЕрдзрд┐рдХрддрдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рдзрд╛рди рдУ (рдПрди ^ 2) рд╕рдордп рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдоред

рд╕рдорд╛рдзрд╛рди рдХреЗ рджреНрд╡рд╛рд░рд╛, рд╣рдо рдЗрдирдкреБрдЯ рд╕рд░рдгреА рдХреЛ рдмреАрдЪ рдореЗрдВ рд╕реЗ 2 рд╕рдмрдЯреНрд░реЗрд╕реЗрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдФрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдпреЛрдЧ рдФрд░ рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдкрд░ рджреЗрдЦреЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП O (n lg n) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рд╣рдо рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ .csv рдлрд╝рд╛рдЗрд▓ рдореЗрдВ www.oanda.com/currency/historical-rates рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ
"2011-10-02","32.1914",,,,
"2011-10-01","32.0809",,,,
"2011-09-30","31.9086",,,,
"2011-09-29","31.7294",,,,
"2011-09-28","32.0421",,,,
"2011-09-27","32.2233",,,,
"2011-09-26","32.0980",,,,
"2011-09-25","32.0673",,,,
...


рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдФрд░ рдЗрд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  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) 


рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдордп рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЙрд▓рдЯрд╛ рдбрд╛рд▓реЗрдВред рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдкрд┐рдЫрд▓реЗ - рд╡рд░реНрддрдорд╛рди рджреИрдирд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдЕрдВрддрд░ рдЦреЛрдЬрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдЗрди рдЕрдВрддрд░реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рдорд╛рддреНрд░рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред

 def find_max_subarray(a, low, high): #   if high == low: return low, high, a[low][1] else: #   2  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 


рдФрд░ рдХреНрд░реЙрд╕-рдЕрдзрд┐рдХрддрдо рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди (рдордзреНрдп-рдордзреНрдп-рд╡рд┐рднрд╛рдЬрди рд╕реЗ рдЧреБрдЬрд░рдирд╛)ред

 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 


рдареАрдХ рд╣реИ, рд╣рдореЗрдВ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрддрд╛ рд╣реИ

 min, max, sum = find_max_subarray(courses, 0, len(courses)-1) print courses[min] print courses[max] print sum 


рдирддреАрдЬрддрди, рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛

['2008-07-16', 0.07420000000000115, '23.1269']
['2009-02-05', 0.12059999999999604, '36.1257']
13.1194


рдФрд░ рдереЛрдбрд╝рд╛ рдЦреЗрд▓, 2011 рдХреА рдирд┐рдЪрд▓реА рддрд╛рд░реАрдЦ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛

['2011-05-05', 0.006199999999999761, '27.2657']
['2011-09-26', 0.12530000000000285, '32.0980']
4.9576


рд╕рднреА рдХреЛрдб gist.github.com/1257729 рдкрд░ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In129576/


All Articles