Skip to content
Open
Changes from all commits
Commits
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
67 changes: 41 additions & 26 deletions searches/double_linear_search.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,52 @@
from __future__ import annotations
"""
Recursive Double Linear Search Algorithm

Searches for a target element in a list
by recursively checking both ends simultaneously.
"""

def double_linear_search(array: list[int], search_item: int) -> int:

def double_linear_search_recursion(
sequence: list[int], target: int, start: int = 0, end: int | None = None
) -> int:
"""
Iterate through the array from both sides to find the index of search_item.
Recursively searches for target in sequence from both ends.

Time Complexity: O(n)
Space Complexity: O(n) due to recursive call stack

:param array: the array to be searched
:param search_item: the item to be searched
:return the index of search_item, if search_item is in array, else -1
:param sequence: A list of integers.
:param target: The integer value to search for.
:param start: Starting index for search window.
:param end: Ending index for search window.
:return: Index of target if found, else -1.

Examples:
>>> double_linear_search([1, 5, 5, 10], 1)
>>> double_linear_search_recursion([1, 2, 3, 4, 5], 1)
0
>>> double_linear_search([1, 5, 5, 10], 5)
1
>>> double_linear_search([1, 5, 5, 10], 100)
>>> double_linear_search_recursion([1, 2, 3, 4, 5], 5)
4
>>> double_linear_search_recursion([1, 2, 3, 4, 5], 3)
2
>>> double_linear_search_recursion([1, 2, 3, 4, 5], 6)
-1
>>> double_linear_search_recursion([], 3)
-1
>>> double_linear_search([1, 5, 5, 10], 10)
3
"""
# define the start and end index of the given array
start_ind, end_ind = 0, len(array) - 1
while start_ind <= end_ind:
if array[start_ind] == search_item:
return start_ind
elif array[end_ind] == search_item:
return end_ind
else:
start_ind += 1
end_ind -= 1
# returns -1 if search_item is not found in array
return -1
if end is None:
end = len(sequence) - 1

if start > end:
return -1

if sequence[start] == target:
return start
if sequence[end] == target:
return end

return double_linear_search_recursion(sequence, target, start + 1, end - 1)


if __name__ == "__main__":
print(double_linear_search(list(range(100)), 40))
import doctest

doctest.testmod()