diff --git a/chapter1/binary.py b/chapter1/binary.py index 5164f87..35cf75a 100644 --- a/chapter1/binary.py +++ b/chapter1/binary.py @@ -6,13 +6,7 @@ logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) -LOWER = 1000 -UPPER = 1000000 -SAMPLE_SIZE = 1000 - - def binary_search(arr, item): - count = 1 low = 0 high = len(arr) - 1 @@ -20,27 +14,29 @@ def binary_search(arr, item): mid = (low + high) // 2 guess = arr[mid] if guess == item: - logger.debug(f"found item after {count} splits") return mid elif guess > item: high = mid - 1 else: low = mid + 1 - count += 1 - return None +LOWER = 1000 +UPPER = 1000000 +SAMPLE_SIZE = 1000 + + numbers = random.sample(range(LOWER, UPPER), SAMPLE_SIZE) numbers.sort() -logger.debug(numbers) start = time.time() -res = None -while res is None: +result = None +while result is None: guess = random.randrange(LOWER, UPPER) - res = binary_search(numbers, guess) + logger.debug(f"guess: {guess}") + result = binary_search(numbers, guess) -print(f"Found {guess} at index {res}. Running time {time.time() - start}") +print(f"Found {guess} at index {result}. Running time {time.time() - start}") diff --git a/chapter4/binary.py b/chapter4/binary.py new file mode 100644 index 0000000..1c82ab6 --- /dev/null +++ b/chapter4/binary.py @@ -0,0 +1,43 @@ +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}")