diff --git a/allalgorithms/subarray/__init__.py b/allalgorithms/subarray/__init__.py new file mode 100644 index 0000000..393ff54 --- /dev/null +++ b/allalgorithms/subarray/__init__.py @@ -0,0 +1 @@ +from .kadane import * diff --git a/allalgorithms/subarray/kadane.py b/allalgorithms/subarray/kadane.py new file mode 100644 index 0000000..c4202f9 --- /dev/null +++ b/allalgorithms/subarray/kadane.py @@ -0,0 +1,44 @@ +# -*- coding: UTF-8 -*- +# +# Kadane's Algorithm +# The All ▲lgorithms library for python +# +# Contributed by: Kunal Keshav Singh Sahni +# Github: @kunal768 +# + +import sys + +def maxsum_subarray(arr): + curr = arr[0] + maxx = arr[0] + n = len(arr) + + for i in range(1,n): + curr = max(arr[i],curr+arr[i]) + maxx = max(curr,maxx) + + return maxx + + +def returnArray(arr): + size = len(arr) + max_so_far = -sys.maxsize - 1 + max_ending_here = 0 + start = 0 + end = 0 + s = 0 + for i in range(0,size): + + max_ending_here += arr[i] + + if max_so_far < max_ending_here: + max_so_far = max_ending_here + start = s + end = i + + if max_ending_here < 0: + max_ending_here = 0 + s = i+1 + + return [max_so_far,arr[start:end+1]] diff --git a/docs/readme.md b/docs/readme.md index 9929e55..71c5d38 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -69,10 +69,15 @@ print(binary_search(arr, 3)) - [Merge Sort](https://python.allalgorithms.com/sorting/merge-sort) - [Pigeonhole Sort](https://python.allalgorithms.com/sorting/pigeonhole-sort) - [Selection Sort](https://python.allalgorithms.com/sorting/selection-sort) - - [Stooge Sort](https://python.allalgorithms.com/sorting/stooge-sort) + - [Stooge Sort](https://python.allalgorithms.com/sorting/stooge-sor + - ### String - [Palindrome Check](https://python.allalgorithms.com/string/palindrom-check) +- ### Subarray + - [Kadane's Algorithm](https://github.com/kunal768/allalgorithms-python/blob/master/allalgorithms/subarray/kadane.py) + + # Related - [allalgorithms-javascript](https://github.com/abranhe/allalgorithms-javascript): All ▲lgorithms Javascript library diff --git a/docs/subarray/kadane.md b/docs/subarray/kadane.md new file mode 100644 index 0000000..ef387b6 --- /dev/null +++ b/docs/subarray/kadane.md @@ -0,0 +1,36 @@ +# Kadane's Algorithm + +Kadane’s algorithm is to look for all positive contiguous segments of the array (max_ending_here is used for this). And keep track of maximum sum contiguous segment among all positive segments (max_so_far is used for this) Each time we get a positive sum compare it with max_so_far and update max_so_far if it is greater than max_so_far +## Install + +``` +pip install allalgorithms +``` + +## Usage + +```py +from allalgorithms.subarray import kadane + +arr = [-2, 1, 2, 7, 10, 77] + +print(kadane.maxsum_subarray(arr)) +# -> 97 + +print(kadane.returnArray(arr)) +# -> [97, [1, 2, 7, 10, 77]] +``` + +## API + +### maxsum_subarray(array) + +> Return sum of maximum contigious subarray + +### returnArray(array) + +> Return sum along with the respective subarray + +##### Params: + +- `array`: Array (may contain negative elements) diff --git a/readme.md b/readme.md index 9929e55..c9429b0 100644 --- a/readme.md +++ b/readme.md @@ -70,9 +70,14 @@ print(binary_search(arr, 3)) - [Pigeonhole Sort](https://python.allalgorithms.com/sorting/pigeonhole-sort) - [Selection Sort](https://python.allalgorithms.com/sorting/selection-sort) - [Stooge Sort](https://python.allalgorithms.com/sorting/stooge-sort) + - ### String - [Palindrome Check](https://python.allalgorithms.com/string/palindrom-check) +- ### Subarray + - [Kadane's Algorithm](https://python.allalgorithms.com/subarray/kadane) + + # Related - [allalgorithms-javascript](https://github.com/abranhe/allalgorithms-javascript): All ▲lgorithms Javascript library diff --git a/tests/test_kadane.py b/tests/test_kadane.py new file mode 100644 index 0000000..63da946 --- /dev/null +++ b/tests/test_kadane.py @@ -0,0 +1,19 @@ +import unittest + +from allalgorithms.subarray import kadane + +class TestSearches(unittest.TestCase): + def test_returnArray(self): + self.assertEqual( [11,[2,3,-1,7]], kadane.returnArray([2,3,-1,7])) + self.assertEqual([5,[2,3]], kadane.returnArray([2,3,-2,4])) + self.assertEqual([0, [0]], kadane.returnArray([-1,-1,-0,0])) + self.assertEqual([-1, [-1]], kadane.returnArray([-1])) + + def test_maxsum_subarray(self): + self.assertEqual(11,kadane.maxsum_subarray([2,3,-1,7])) + self.assertEqual(5, kadane.maxsum_subarray([2,3,-2,4])) + self.assertEqual(0, kadane.maxsum_subarray([-1,-1,-0,0])) + self.assertEqual(-1, kadane.maxsum_subarray([-1])) + +if __name__ == '__main__': + unittest.main()