Skip to content

Commit aa1eee1

Browse files
authored
Update and rename Exponential_Search.py to exponential_search.py
1 parent e38e626 commit aa1eee1

File tree

2 files changed

+112
-82
lines changed

2 files changed

+112
-82
lines changed

searches/Exponential_Search.py

-82
This file was deleted.

searches/exponential_search.py

+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#!/usr/bin/env python3
2+
3+
"""
4+
Pure Python implementation of exponential search algorithm
5+
6+
For more information, see the Wikipedia page:
7+
https://en.wikipedia.org/wiki/Exponential_search
8+
9+
For doctests run the following command:
10+
python3 -m doctest -v exponential_search.py
11+
12+
For manual testing run:
13+
python3 exponential_search.py
14+
"""
15+
16+
from __future__ import annotations
17+
18+
19+
def binary_search_by_recursion(
20+
sorted_collection: list[int], item: int, left: int = 0, right: int = -1
21+
) -> int:
22+
"""Pure implementation of binary search algorithm in Python using recursion
23+
24+
Be careful: the collection must be ascending sorted otherwise, the result will be
25+
unpredictable.
26+
27+
:param sorted_collection: some ascending sorted collection with comparable items
28+
:param item: item value to search
29+
:param left: starting index for the search
30+
:param right: ending index for the search
31+
:return: index of the found item or -1 if the item is not found
32+
33+
Examples:
34+
>>> binary_search_by_recursion([0, 5, 7, 10, 15], 0, 0, 4)
35+
0
36+
>>> binary_search_by_recursion([0, 5, 7, 10, 15], 15, 0, 4)
37+
4
38+
>>> binary_search_by_recursion([0, 5, 7, 10, 15], 5, 0, 4)
39+
1
40+
>>> binary_search_by_recursion([0, 5, 7, 10, 15], 6, 0, 4)
41+
-1
42+
"""
43+
if right < 0:
44+
right = len(sorted_collection) - 1
45+
if list(sorted_collection) != sorted(sorted_collection):
46+
raise ValueError("sorted_collection must be sorted in ascending order")
47+
if right < left:
48+
return -1
49+
50+
midpoint = left + (right - left) // 2
51+
52+
if sorted_collection[midpoint] == item:
53+
return midpoint
54+
elif sorted_collection[midpoint] > item:
55+
return binary_search_by_recursion(sorted_collection, item, left, midpoint - 1)
56+
else:
57+
return binary_search_by_recursion(sorted_collection, item, midpoint + 1, right)
58+
59+
60+
def exponential_search(sorted_collection: list[int], item: int) -> int:
61+
"""
62+
Pure implementation of an exponential search algorithm in Python.
63+
For more information, refer to:
64+
https://en.wikipedia.org/wiki/Exponential_search
65+
66+
Be careful: the collection must be ascending sorted, otherwise the result will be
67+
unpredictable.
68+
69+
:param sorted_collection: some ascending sorted collection with comparable items
70+
:param item: item value to search
71+
:return: index of the found item or -1 if the item is not found
72+
73+
The time complexity of this algorithm is O(log i) where i is the index of the item.
74+
75+
Examples:
76+
>>> exponential_search([0, 5, 7, 10, 15], 0)
77+
0
78+
>>> exponential_search([0, 5, 7, 10, 15], 15)
79+
4
80+
>>> exponential_search([0, 5, 7, 10, 15], 5)
81+
1
82+
>>> exponential_search([0, 5, 7, 10, 15], 6)
83+
-1
84+
"""
85+
if list(sorted_collection) != sorted(sorted_collection):
86+
raise ValueError("sorted_collection must be sorted in ascending order")
87+
88+
if sorted_collection[0] == item:
89+
return 0
90+
91+
bound = 1
92+
while bound < len(sorted_collection) and sorted_collection[bound] < item:
93+
bound *= 2
94+
95+
left = bound // 2
96+
right = min(bound, len(sorted_collection) - 1)
97+
return binary_search_by_recursion(sorted_collection, item, left, right)
98+
99+
100+
if __name__ == "__main__":
101+
import doctest
102+
doctest.testmod()
103+
104+
# Manual testing
105+
user_input = input("Enter numbers separated by commas: ").strip()
106+
collection = sorted(int(item) for item in user_input.split(","))
107+
target = int(input("Enter a number to search for: "))
108+
result = exponential_search(sorted_collection=collection, item=target)
109+
if result == -1:
110+
print(f"{target} was not found in {collection}.")
111+
else:
112+
print(f"{target} was found at index {result} in {collection}.")

0 commit comments

Comments
 (0)