Skip to content

add exponential search algorithm #10732

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Oct 21, 2023
Merged
Changes from 6 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
703f3b8
add exponential_search algorithm
kiarash8112 Oct 20, 2023
dbbe135
replace binary_search with binary_search_recursion
kiarash8112 Oct 20, 2023
1d79bd0
convert left type to int to be useable in binary_search_recursion
kiarash8112 Oct 20, 2023
ff30ae0
add docs and tests for exponential_search algorithm
kiarash8112 Oct 20, 2023
f66e566
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 20, 2023
16f58e1
move exponential_search to binary_search.py to pass github auto build…
kiarash8112 Oct 20, 2023
26b5283
Update searches/binary_search.py
kiarash8112 Oct 21, 2023
63bf03a
remove additional space searches/binary_search.py
kiarash8112 Oct 21, 2023
4ca8a6a
return single data type in exponential_search searches/binary_search.py
kiarash8112 Oct 21, 2023
b524404
add doctest mod searches/binary_search.py
kiarash8112 Oct 21, 2023
dc9155a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 21, 2023
afbd458
use // instread of int() convert searches/binary_search.py
kiarash8112 Oct 21, 2023
d8dfe74
change test according to new code searches/binary_search.py
kiarash8112 Oct 21, 2023
66a03cb
fix binary_search_recursion multiple type return error
Oct 21, 2023
d76119b
add a timeit benchmark for exponential_search
Oct 21, 2023
dc32f86
sort input of binary search to be equal in performance test with expo…
Oct 21, 2023
0b53cdd
raise value error instead of sorting input in binary and exonential s…
Oct 21, 2023
49744fb
Update binary_search.py
cclauss Oct 21, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions searches/binary_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,49 @@ def binary_search_by_recursion(
return binary_search_by_recursion(sorted_collection, item, midpoint + 1, right)


def exponential_search(sorted_collection: list[int], item: int) -> int | None:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not a fan of functions that return multiple datatypes. If the search fails, let's return -1 (like "Hello".find("Z")) or raise a ValueError (like "Hello".index("Z")).

Suggested change
def exponential_search(sorted_collection: list[int], item: int) -> int | None:
def exponential_search(sorted_collection: list[int], item: int) -> int:

"""Pure implementation of exponential search algorithm in Python
Resources used:
https://en.wikipedia.org/wiki/Exponential_search

Be careful collection must be ascending sorted, otherwise result will be
unpredictable

:param sorted_collection: some ascending sorted collection with comparable items
:param item: item value to search
:return: index of found item or None if item is not found

the order of this algorithm is O(lg I) where I is index position of item if exist

Examples:
>>> exponential_search([0, 5, 7, 10, 15], 0)
0

>>> exponential_search([0, 5, 7, 10, 15], 15)
4

>>> exponential_search([0, 5, 7, 10, 15], 5)
1

>>> exponential_search([0, 5, 7, 10, 15], 6)

"""
bound = 1
while bound < len(sorted_collection) and sorted_collection[bound] < item:
bound *= 2
left = int(bound / 2)
right = min(bound, len(sorted_collection) - 1)
return binary_search_by_recursion(
sorted_collection=sorted_collection, item=item, left=left, right=right
)


if __name__ == "__main__":
import doctest

doctest.testmod()


if __name__ == "__main__":
user_input = input("Enter numbers separated by comma:\n").strip()
collection = sorted(int(item) for item in user_input.split(","))
Expand Down