"""author : Mayank Kumar Jha (mk9440)"""from typing import Listdef find_max_sub_array(A, low, high):if low == high:return low, high, A[low]else:mid = (low + high) // 2left_low, left_high, left_sum = find_max_sub_array(A, low, mid)right_low, right_high, right_sum = find_max_sub_array(A, mid + 1, high)cross_left, cross_right, cross_sum = find_max_cross_sum(A, low, mid, high)if left_sum >= right_sum and left_sum >= cross_sum:return left_low, left_high, left_sumelif right_sum >= left_sum and right_sum >= cross_sum:return right_low, right_high, right_sumelse:return cross_left, cross_right, cross_sumdef find_max_cross_sum(A, low, mid, high):left_sum, max_left = -999999999, -1right_sum, max_right = -999999999, -1summ = 0for i in range(mid, low - 1, -1):summ += A[i]if summ > left_sum:left_sum = summmax_left = isumm = 0for i in range(mid + 1, high + 1):summ += A[i]if summ > right_sum:right_sum = summmax_right = ireturn max_left, max_right, (left_sum + right_sum)def max_sub_array(nums: List[int]) -> int:"""Finds the contiguous subarray which has the largest sum and return its sum.>>> max_sub_array([-2, 1, -3, 4, -1, 2, 1, -5, 4])6An empty (sub)array has sum 0.>>> max_sub_array([])0If all elements are negative, the largest subarray would be the empty array,having the sum 0.>>> max_sub_array([-1, -2, -3])0>>> max_sub_array([5, -2, -3])5>>> max_sub_array([31, -41, 59, 26, -53, 58, 97, -93, -23, 84])187"""best = 0current = 0for i in nums:current += iif current < 0:current = 0best = max(best, current)return bestif __name__ == "__main__":"""A random simulation of this algorithm."""import timefrom random import randintfrom matplotlib import pyplot as pltinputs = [10, 100, 1000, 10000, 50000, 100000, 200000, 300000, 400000, 500000]tim = []for i in inputs:li = [randint(1, i) for j in range(i)]strt = time.time()(find_max_sub_array(li, 0, len(li) - 1))end = time.time()tim.append(end - strt)print("No of Inputs Time Taken")for i in range(len(inputs)):print(inputs[i], "\t\t", tim[i])plt.plot(inputs, tim)plt.xlabel("Number of Inputs")plt.ylabel("Time taken in seconds ")plt.show()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。