Skip to content

Commit ac979fb

Browse files
committed
Move accross in slices to make more performant
1 parent 9b99474 commit ac979fb

File tree

3 files changed

+46
-35
lines changed

3 files changed

+46
-35
lines changed
Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
1-
from itertools import combinations, accumulate
1+
from itertools import accumulate
22
from typing import Optional
33

44

55
def continuous_subset_adding_up_to(full_set: list[int], target_sum: int) -> Optional[list[int]]:
66
accumulated_sums = list(accumulate(full_set))
77

8-
start_index = 0
9-
while len(full_set) > 0:
10-
maximum_end_index = len(accumulated_sums) - 1
11-
end_index = start_index
12-
while end_index <= maximum_end_index:
13-
if accumulated_sums[end_index] == target_sum:
14-
return full_set[start_index : end_index + 1]
15-
elif accumulated_sums[end_index] - accumulated_sums[start_index] == target_sum:
16-
return full_set[start_index + 1 : end_index + 1]
17-
end_index += 1
18-
19-
# Move in one from the left
20-
del full_set[0]
21-
del accumulated_sums[0]
8+
slice_length = 1
9+
list_length = len(full_set)
10+
while slice_length <= list_length:
11+
left_index = 0
12+
while left_index <= list_length - slice_length:
13+
right_index = left_index + slice_length - 1
14+
if left_index == 0:
15+
if accumulated_sums[right_index] == target_sum:
16+
return full_set[left_index:slice_length]
17+
elif accumulated_sums[right_index] - accumulated_sums[left_index - 1] == target_sum:
18+
if slice_length == 1:
19+
return [full_set[right_index]]
20+
else:
21+
return full_set[left_index : left_index + slice_length]
22+
left_index += 1
23+
slice_length += 1
2224

2325
# Not able to find a subset adding up to target
2426
return None

list_things/tests/test_continuous_subset.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,39 @@
44

55

66
class TestContinousSubsetAddingUpTo:
7+
def test_sublist_with_unnattainable_target_returns_none(self):
8+
assert continuous_subset_adding_up_to([13, 2, 1], 8) is None
9+
710
@pytest.mark.parametrize(
811
"full_set,target_sum,expected",
912
[
1013
([1], 1, [1]),
1114
([1, 2, 3, 4], 1, [1]),
12-
([1, 2, 3, 4], 3, [1, 2]),
15+
([1, 2, 3, 4], 3, [3]),
1316
([1, 2, 3, 4], 6, [1, 2, 3]),
1417
([1, 2, 3, 4], 10, [1, 2, 3, 4]),
1518
([1, 2, 3, 4], 9, [2, 3, 4]),
1619
([1, 2, 3, 4], 7, [3, 4]),
1720
([1, 2, 3, 4], 4, [4]),
21+
([1, 2, 3, 4], 5, [2, 3]),
1822
],
1923
)
2024
def test_returns_subset_adding_up_to_target_sum(self, full_set, target_sum, expected):
2125
assert continuous_subset_adding_up_to(full_set, target_sum) == expected
2226

23-
def test_sublist_with_unnattainable_target_returns_none(self):
24-
assert continuous_subset_adding_up_to([13, 2, 1], 8) is None
27+
@pytest.mark.parametrize(
28+
"list_size,target_sum",
29+
[
30+
(1000, 1076),
31+
(1000, 13076),
32+
(10000, 130476),
33+
(100000, 1500090),
34+
(1000000, 1500090), # Takes about 350ms
35+
(10000000, 1500090), # Takes about 642ms
36+
(10000000, 97000900), # Takes about 30s
37+
],
38+
)
39+
def test_works_with_larger_lists(self, list_size, target_sum):
40+
result = continuous_subset_adding_up_to(list(range(list_size)), target_sum)
41+
print(f"\nResult: {result}")
42+
assert sum(result) == target_sum

list_things/tests/test_scattered_subset.py

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,14 @@ def test_returns_subset_adding_up_to_target_sum(self, full_set, target_sum, expe
2323
assert scattered_subset_adding_up_to(full_set, target_sum).sort() == expected.sort()
2424

2525
@pytest.mark.parametrize(
26-
"target_sum",
26+
"list_size,target_sum",
2727
[
28-
1,
29-
55,
30-
943,
31-
777,
32-
1234,
33-
# 4321, Times out
28+
(1000, 1234),
29+
(1000, 1076),
30+
# (1000, 3076), Times out
3431
],
3532
)
36-
def test_works_with_larger_lists(self, target_sum):
37-
assert sum(scattered_subset_adding_up_to(list(range(1000)), target_sum)) == target_sum
38-
39-
@pytest.mark.parametrize(
40-
"target_sum",
41-
[1076523],
42-
)
43-
@pytest.mark.skip("Times out")
44-
def test_works_with_a_target_bigger_than_any_element_in_a_much_larger_list(self, target_sum):
45-
assert sum(scattered_subset_adding_up_to(list(range(1000000)), target_sum)) == target_sum
33+
def test_works_with_a_target_bigger_than_any_element_in_a_much_larger_list(
34+
self, list_size, target_sum
35+
):
36+
assert sum(scattered_subset_adding_up_to(list(range(list_size)), target_sum)) == target_sum

0 commit comments

Comments
 (0)