mirror of
https://github.com/onyx-and-iris/grokking-algorithms.git
synced 2024-11-16 01:40:53 +00:00
44 lines
979 B
Python
44 lines
979 B
Python
|
import logging
|
||
|
import random
|
||
|
import time
|
||
|
|
||
|
logging.basicConfig(level=logging.DEBUG)
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
def binary_search(arr, low, high, x):
|
||
|
# x not found, low has overlapped high so we return None
|
||
|
if high < low:
|
||
|
return
|
||
|
|
||
|
mid = (high + low) // 2
|
||
|
|
||
|
# x found at middle of split, return its index
|
||
|
if arr[mid] == x:
|
||
|
return mid
|
||
|
|
||
|
# x in left side of split
|
||
|
elif arr[mid] > x:
|
||
|
return binary_search(arr, low, mid - 1, x)
|
||
|
|
||
|
# x in right side of split
|
||
|
else:
|
||
|
return binary_search(arr, mid + 1, high, x)
|
||
|
|
||
|
|
||
|
LOWER = 1000
|
||
|
UPPER = 1000000
|
||
|
SAMPLE_SIZE = 1000
|
||
|
|
||
|
numbers = random.sample(range(LOWER, UPPER), SAMPLE_SIZE)
|
||
|
numbers.sort()
|
||
|
|
||
|
start = time.time()
|
||
|
result = None
|
||
|
while result is None:
|
||
|
guess = random.randrange(LOWER, UPPER)
|
||
|
logger.debug(f"guess: {guess}")
|
||
|
result = binary_search(numbers, 0, len(numbers) - 1, guess)
|
||
|
|
||
|
print(f"Found {guess} at index {result}. Running time {time.time() - start}")
|