-
-
Notifications
You must be signed in to change notification settings - Fork 47.2k
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
Conversation
for more information, see https://pre-commit.ci
… tests delete exponential_search.py file
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice addition!
For optional extra credit, add a timeit
benchmark to show relative performance.
searches/binary_search.py
Outdated
@@ -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: |
There was a problem hiding this comment.
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")
).
def exponential_search(sorted_collection: list[int], item: int) -> int | None: | |
def exponential_search(sorted_collection: list[int], item: int) -> int: |
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>
for more information, see https://pre-commit.ci
Co-authored-by: Christian Clauss <cclauss@me.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
I thought more about sorting the sorted collection… it is a bad idea. The second item in might be different in the two lists so the function might tell me that is the second item when in my list it is the third item. So, the implementations should raise ValueError on unsorted input. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a really slick addition. Thanks for doing it!
@cclauss thank you for your suggestions :) |
@cclauss Since exponential search is a different algorithm from binary search, why was it placed in the |
bound *= 2 | ||
left = bound // 2 | ||
right = min(bound, len(sorted_collection) - 1) | ||
last_result = binary_search_by_recursion( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tianyizheng02 exponential_search()
embeds a call to binary_search_by_recursion()
but as the benchmarks demonstrate delivers a faster result. Looking at the first commit makes this clearer.
Describe your change:
added exponential algorithm using binary_search_recursion also tests and docs about it
Checklist: