Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upCreated triplet_sum in Python/other #2362
Conversation
TravisBuddy
commented
Aug 28, 2020
Hey @Kush1101, TravisCI finished with status TravisBuddy Request Identifier: 94a8bd60-e90b-11ea-ae3c-2d16223a9f65 |
@cclauss Please review. |
OK... With this one we are going to write two different functions in the same file that solve the same problem and then we are going to write a timeit benchmark to tell us which one is faster. The second function should leverage the itertools module (combinations() or permutations()) and should pass the same doctests. |
Okk. Working on it |
I have written two functions, but I am still not sure about the proper way to include timeit in this code. def triplet_sum1(arr:List[int],X:int) ->tuple:
"""
Returns a triplet in in array with sum equal to X,
else (0, 0, 0).
>>> triplet_sum1([13, 29, 7, 23, 5], 35)
(5, 7, 23)
>>> triplet_sum1([37, 9, 19, 50, 44], 65)
(9, 19, 37)
>>> arr = [6, 47, 27, 1, 15]
>>> summ = 11
>>> triplet_sum1(arr,summ)
(0, 0, 0)
"""
triplets = list(permutations(arr,3))
for triplet in triplets:
if sum(triplet) == X:
return tuple(sorted(triplet))
return (0, 0, 0)
def triplet_sum2(arr: List[int], X: int) -> tuple:
"""
Returns a triplet in in array with sum equal to X,
else (0, 0, 0).
>>> triplet_sum2([13, 29, 7, 23, 5], 35)
(5, 7, 23)
>>> triplet_sum2([37, 9, 19, 50, 44], 65)
(9, 19, 37)
>>> arr = [6, 47, 27, 1, 15]
>>> summ = 11
>>> triplet_sum2(arr,summ)
(0, 0, 0)
"""
arr.sort()
n = len(arr)
for i in range(n - 1):
left, right = i + 1, n - 1
while left < right:
if arr[i] + arr[left] + arr[right] == X:
return (arr[i], arr[left], arr[right])
elif arr[i] + arr[left] + arr[right] < X:
left += 1
elif arr[i] + arr[left] + arr[right] > X:
right -= 1
else:
return (0, 0, 0) Now should I do it like this? """
"""
Given an array of integers and another integer X,
we are required to find a triplet from the array such that it's sum is equal to X
"""
from typing import List
from itertools import permutations
from timeit import repeat
def triplet_sum1(arr: List[int], X: int) -> tuple:
"""
Returns a triplet in in array with sum equal to X,
else (0, 0, 0).
>>> triplet_sum1([13, 29, 7, 23, 5], 35)
(5, 7, 23)
>>> triplet_sum1([37, 9, 19, 50, 44], 65)
(9, 19, 37)
>>> arr = [6, 47, 27, 1, 15]
>>> summ = 11
>>> triplet_sum1(arr,summ)
(0, 0, 0)
"""
triplets = list(permutations(arr, 3))
for triplet in triplets:
if sum(triplet) == X:
return tuple(sorted(triplet))
return (0, 0, 0)
def sol1_time():
setup_code = """
from __main__ import triplet_sum1
from random import randint"""
test_code = """
arr = [randint(-1000, 1000) for i in range(10)]
r = randint(-5000, 5000)
triplet_sum1(arr,r)
"""
times = repeat(stmt=test_code, setup=setup_code, repeat=5, number=10000)
return f"Naive solution time is {min(times)}"
def triplet_sum2(arr: List[int], X: int) -> tuple:
"""
Returns a triplet in in array with sum equal to X,
else (0, 0, 0).
>>> triplet_sum2([13, 29, 7, 23, 5], 35)
(5, 7, 23)
>>> triplet_sum2([37, 9, 19, 50, 44], 65)
(9, 19, 37)
>>> arr = [6, 47, 27, 1, 15]
>>> summ = 11
>>> triplet_sum2(arr,summ)
(0, 0, 0)
"""
arr.sort()
n = len(arr)
for i in range(n - 1):
left, right = i + 1, n - 1
while left < right:
if arr[i] + arr[left] + arr[right] == X:
return (arr[i], arr[left], arr[right])
elif arr[i] + arr[left] + arr[right] < X:
left += 1
elif arr[i] + arr[left] + arr[right] > X:
right -= 1
else:
return (0, 0, 0)
def sol2_time():
setup_code = """
from __main__ import triplet_sum2
from random import randint"""
test_code = """
arr = [randint(-1000, 1000) for i in range(10)]
r = randint(-5000, 5000)
triplet_sum2(arr,r)
"""
times = repeat(stmt=test_code, setup=setup_code, repeat=5, number=10000)
return f"Optimized solution time is {min(times)}"
if __name__ == "__main__":
from doctest import testmod
testmod()
from random import randint
arr = [randint(-1000, 1000) for i in range(100)]
r = randint(-5000, 5000)
print(f"{triplet_sum1(arr,r)}")
print(f"{sol1_time()}")
print(f"{triplet_sum2(arr,r)}")
print(f"{sol2_time()}") |
I made a PR, so it will be easier for you to review and propose changes. @cclauss |
TravisBuddy
commented
Aug 28, 2020
Hey @Kush1101, TravisCI finished with status TravisBuddy Request Identifier: b60306c0-e918-11ea-ae3c-2d16223a9f65 |
Nice! A few trailing whitespaces to clean up. When benchmarking it is vital that both algorithms are tested with the exact same dataset so please do something like this... def make_dataset():
<your code here>
return arr, target
dataset = make_dataset()
...
from __main__ import dataset, triplet_sum1, triplet_sum2
...
triplet_sum1(*dataset)
...
triplet_sum2(*dataset) |
I will do it now. |
Co-authored-by: Christian Clauss <cclauss@me.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
TravisBuddy
commented
Aug 28, 2020
Hey @Kush1101, TravisCI finished with status TravisBuddy Request Identifier: 99b5bed0-e928-11ea-ae3c-2d16223a9f65 |
TravisBuddy
commented
Aug 28, 2020
Hey @Kush1101, TravisCI finished with status TravisBuddy Request Identifier: bdf40130-e928-11ea-ae3c-2d16223a9f65 |
TravisBuddy
commented
Aug 28, 2020
Hey @Kush1101, TravisCI finished with status TravisBuddy Request Identifier: ea5d2d00-e928-11ea-ae3c-2d16223a9f65 |
I tried to incorporate all the proposed changes. Both the functions are now tested on the same dataset. I also made other small changes. Please review it now. @cclauss |
Co-authored-by: Christian Clauss <cclauss@me.com>
This is very impressive. Nice work. This shows the power of an algorithm. The Python standard library gives us tools to express complex things simply -- triplet_sum1() short, tidy, and easy to reason about. However, it is no match of the specific algorithm in triplet_sum2() that is longer and more difficult to reason about but delivers correct answers in a fraction of the time. |
EXCELLENT!! The benchmark clearly shows the winner! |
True. |
Kush1101 commentedAug 28, 2020
Describe your change:
Checklist:
Fixes: #{$ISSUE_NO}
.