Files
troupe-standup/wizard-work/beam/test_rotated_binary_search.py
T

58 lines
1.7 KiB
Python

import random
from rotated_binary_search import find_pivot, search, count_rotations
def test_empty():
assert find_pivot([]) == -1
assert search([], 5) == -1
assert count_rotations([]) == 0
def test_single():
assert find_pivot([7]) == 0
assert search([7], 7) == 0
assert search([7], 3) == -1
def test_sorted_no_rotation():
a = [1,2,3,4,5]
assert find_pivot(a) == 0
for t in a + [0,6]:
idx = search(a, t)
assert (idx == -1) == (t not in a)
if idx != -1:
assert a[idx] == t
def test_rotated():
base = [1,2,3,4,5,6,7]
for r in range(len(base)):
arr = base[r:] + base[:r]
expected_pivot = (len(base) - r) % len(base)
assert find_pivot(arr) == expected_pivot, (r, find_pivot(arr), expected_pivot)
assert count_rotations(arr) == expected_pivot
for t in base:
i = search(arr, t)
assert i != -1 and arr[i] == t
def test_duplicates():
arr = [2,2,2,3,3,1,1,2]
# pivot should point at a minimum (value 1)
p = find_pivot(arr)
assert arr[p] == 1
assert search(arr, 3) != -1
assert search(arr, 9) == -1
def test_randomized():
random.seed(7)
for _ in range(2000):
n = random.randint(0, 30)
base = sorted(random.randint(-5,5) for _ in range(n))
r = random.randrange(n) if n else 0
arr = base[r:] + base[:r] if n else []
p = find_pivot(arr)
if n:
assert arr[p] == min(arr)
# search every element
for t in set(base):
i = search(arr, t)
assert i == -1 or arr[i] == t
# search absent
assert search(arr, 10**9) == -1