mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
f64b602938
* Update max_sub_array.py added another method of computing maximum sum subarray * Update max_sub_array.py * Update max_sub_array.py
81 lines
2.2 KiB
Python
81 lines
2.2 KiB
Python
"""
|
|
author : Mayank Kumar Jha (mk9440)
|
|
"""
|
|
from __future__ import print_function
|
|
from typing import List
|
|
import time
|
|
import matplotlib.pyplot as plt
|
|
from random import randint
|
|
def find_max_sub_array(A,low,high):
|
|
if low==high:
|
|
return low,high,A[low]
|
|
else :
|
|
mid=(low+high)//2
|
|
left_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_sum
|
|
elif right_sum>=left_sum and right_sum>=cross_sum :
|
|
return right_low,right_high,right_sum
|
|
else:
|
|
return cross_left,cross_right,cross_sum
|
|
|
|
def find_max_cross_sum(A,low,mid,high):
|
|
left_sum,max_left=-999999999,-1
|
|
right_sum,max_right=-999999999,-1
|
|
summ=0
|
|
for i in range(mid,low-1,-1):
|
|
summ+=A[i]
|
|
if summ > left_sum:
|
|
left_sum=summ
|
|
max_left=i
|
|
summ=0
|
|
for i in range(mid+1,high+1):
|
|
summ+=A[i]
|
|
if summ > right_sum:
|
|
right_sum=summ
|
|
max_right=i
|
|
return max_left,max_right,(left_sum+right_sum)
|
|
|
|
def max_sub_array(nums: List[int]) -> int:
|
|
"""
|
|
Finds the contiguous subarray (can be empty array)
|
|
which has the largest sum and return its sum.
|
|
|
|
>>> max_sub_array([-2,1,-3,4,-1,2,1,-5,4])
|
|
6
|
|
>>> max_sub_array([])
|
|
0
|
|
>>> max_sub_array([-1,-2,-3])
|
|
0
|
|
"""
|
|
best = 0
|
|
current = 0
|
|
for i in nums:
|
|
current += i
|
|
if current < 0:
|
|
current = 0
|
|
best = max(best, current)
|
|
return best
|
|
|
|
if __name__=='__main__':
|
|
inputs=[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()
|
|
|
|
|
|
|
|
|