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()
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: