Определить, находится ли число в массиве интервалов

#python #binary-search

#python #двоичный-поиск

Вопрос:

Я хотел бы выполнить двоичный поиск элемента в массиве интервалов. Например, мне нужно найти индекс интервала, который включает 35 дюймов intervals = [[1,10], [11, 18], [21, 24], [25, 32], [33, 40], [42, 43]] . Кроме того, если число не найдено ни в одном из интервалов, алгоритм должен вернуть -1. Возможно ли это на python3? Как я могу изменить свою стандартную двоичную функцию поиска, чтобы она возвращала то, что мне нужно? Вот как выглядит моя двоичная функция поиска:

 def b_search(array, element, start, end):
    if start > end:
        return -1
    mid = (start   end) // 2
    if element == array[mid]:
        return mid
    if element < array[mid]:
        return b_search(array, element, start, mid-1)
    else:
        return b_search(array, element, mid 1, end)
  

Заранее спасибо.

Ответ №1:

 intervals = [[1,10], [11, 18], [21, 24], [25, 32], [33, 40], [42, 43]]
number = 50
idx_list = [i for i,interval in enumerate(intervals) if interval[0] <= number <= interval[1]]
idx = -1  if not idx_list else idx_list[0]
print(idx)
  

Для двоичного поиска используйте приведенный ниже код:

 def b_search_2d(arr_2d, element, start=0, end=0):
    if end == 0:
        end = len(arr_2d) - 1
    if start > end:
        return -1
    mid = (start   end) // 2
    if arr_2d[mid][0] <= element <= arr_2d[mid][1]:
        return mid
    elif element < arr_2d[mid][0]:
        return b_search_2d(arr_2d, element, start, mid-1)
    else:
        return b_search_2d(arr_2d, element, mid 1, end)       
intervals = [[1,10], [11, 18], [21, 24], [25, 32], [33, 40], [42, 43]]
print(b_search_2d(intervals, 35))
print(b_search_2d(intervals, 50))
  

Ответ №2:

Вам нужно изменить двоичный поиск таким образом, чтобы вместо проверки, равен ли элемент середине, вам нужно проверить, находится ли элемент в среднем интервале:

 def b_search(array, element, start, end):
    if start > end:
        return -1
    mid = (start   end) // 2
    if array[mid][0] <= element <= array[mid][1]:
        return mid
    if element < array[mid][0]:
        return b_search(array, element, start, mid-1)
    return b_search(array, element, mid 1, end)