def search_interpolate(value, list):
start = 0
end = len(list) - 1
found = False
while start <= end and value >= list[start] and value <= list[end]:
print(f'DEBUG: {start} - {end}')
# Find the mid point
if list[start] != list[end]:
mid = start + int( ( float(end - start) / (list[end] - list[start]) )
* (value - list[start]) )
else:
mid = start
print(f'DEBUG: proposed mid = {mid}')
# Compare the value at mid point with search value
if list[mid] == value:
print(f"DEBUG: found on position {mid}!!!")
found = True
break
else:
if value < list[mid]:
end = mid - 1
print(f'DEBUG: changing end to {end}')
else:
start = mid + 1
print(f'DEBUG: changing start to {start}')
if found:
return mid
else:
return None
list = [0, 1, 2, 3, 3, 4, 5, 6, 7, 9]
search_value = 6
idx = search_interpolate(search_value, list)
print(f'{search_value} is on the {list} on position {idx}')
list = [0, 1, 2, 3, 3, 4, 5, 6, 700, 900]
search_value = 6
idx = search_interpolate(search_value, list)
print(f'{search_value} is on the {list} on position {idx}')
def search_binary(value, list):
start = 0
end = len(list)-1
found = False
while start <= end and not found:
mid = (start + end) // 2
if list[mid] == value:
found = True
else:
if value < list[mid]:
end = mid - 1
else:
start = mid + 1
if found:
return mid
else:
return None
def search_interpolate(value, list):
start = 0
end = len(list) - 1
found = False
while start <= end and value >= list[start] and value <= list[end]:
# print(f'DEBUG: {start} - {end}')
# Find the mid point
if list[start] != list[end]:
mid = start + int( ( float(end - start) / (list[end] - list[start]) )
* (value - list[start]) )
else:
mid = start
# print(f'DEBUG: proposed mid = {mid}')
# Compare the value at mid point with search value
if list[mid] == value:
# print(f"DEBUG: found on position {mid}!!!")
found = True
break
else:
if value < list[mid]:
end = mid - 1
# print(f'DEBUG: changing end to {end}')
else:
start = mid + 1
# print(f'DEBUG: changing start to {start}')
if found:
return mid
else:
return None
import time
import random
max_len = 100000000
ordered_list = list(range(max_len))
value = random.randint(0, max_len)
print(f'Searching value {value}')
# checking time - binary search
start = time.perf_counter_ns()
idx = search_binary(value, ordered_list)
stop = time.perf_counter_ns()
print(f'Binary search: value found at {idx} in {stop - start} nano seconds')
# checking time - interpolate search
start = time.perf_counter_ns()
idx = search_interpolate(value, ordered_list)
stop = time.perf_counter_ns()
print(f'Interpolation search: value found at {idx} in {stop - start} nano seconds')