2分探索
2分探索の練習です。
2分探索を使って、リストの中で目標に最も近い値を探します。
例えば、 [1, 3, 5, 6, 6, 8, 9, 11, 15, 16] というリストがあって目標が14だとすると、一番近い値は近い値は15になります。
def binary_search_find_closest(data, target):
if len(data) == 0:
return None
if len(data) == 1:
return data[0]
min_diff = float('inf')
imin = 0
imax = len(data) - 1
closest_num = None
while imin <= imax:
imid = imin + (imax - imin) // 2
# 中心の左右の値と目標との差を計算する。
if imid + 1 < len(data):
min_diff_right = abs(data[imid+1] - target)
if imid > 0:
min_diff_left = abs(data[imid-1] - target)
# 最初の差と最も最小に近い値を更新する。
if min_diff_left < min_diff:
min_diff = min_diff_left
closest_num = data[imid-1]
if min_diff_right < min_diff:
min_diff = min_diff_right
closest_num = data[imid+1]
# 2分探索する。
if data[imid] < target:
imin = imid + 1
elif data[imid] > target:
imax = imid -1
else:
return data[imid]
return closest_num
list_given = [1, 3, 5, 6, 6, 8, 9, 11, 15, 16]
# 15が表示される。
print(binary_search_find_closest(list_given, 14))