Я пытался написать функцию двоичного поиска, чтобы найти все уникальные числа в списке. Я знаю, что мне нужно найти среднее значение списка и сравнить его с первым и последним элементом в зависимости от размера числа. Но я не вижу, как все элементы проверяются друг на друга, чтобы найти не дубликаты. Я мог бы легко сделать len(set(list)) для удаления всех дубликатов, но не знаю, как использовать его в двоичном поиске.
Был бы признателен за вашу помощь.
Двоичный поиск в списке работает только в том случае, если список отсортирован, и это действительно имеет смысл, только если вы ищете одно значение. Если у вас есть отсортированный список и вы хотите его дедупликацию, вы хотите просто пройти по нему по прямой линии, а не выполнять двоичный поиск для каждого элемента. Возможно, вы могли бы уточнить список и почему вы конкретно пытаетесь использовать бинарный поиск для этой проблемы.
Этого вполне можно добиться, если список сначала отсортирован. Вот как это должно работать: (цитата из различных веб-источников) Этот пример, показанный здесь, просто пытается найти один повторяющийся номер.
Это можно сделать за время O(Log n). Наблюдение здесь:
Все числа перед требуемым имеют первое вхождение в четном индексе (0, 2, ..) и следующее вхождение в нечетном индексе (1, 3, …). И все элементы после обязательных элементов имеют первое вхождение по нечетному индексу и следующее вхождение по четному индексу.
Давайте возьмем фрагмент кода для демонстрации идеи/шагов:
def binary_search(A, l, h):
# l: low, h: high <- Base case
if l > h: return None
if l == h: return A[l]
# the middle point
mid = (h + l)//2
# If mid is even ...
if mid % 2 == 0:
if A[mid] == A[mid+1]:
return binary_search(A, mid+2, h)
else:
return binary_search(A, l, mid)
else:
if A[mid] == A[mid-1]: # mid is odd
return binary_search(A, mid+1, h)
else:
return binary_search(A, l, mid-1)
# Test code
A = [1, 1, 3, 4, 4, 5, 5]
single = binary_search(A, 0, len(A)-1)
print(f'The unique number is {single} ')
Output:
3
Что делать, если у вас три единицы? Это умный подход, только если числа дублируются ровно дважды, но, не зная больше, трудно сказать, является ли это правильным ответом.
Хорошая точка зрения. @Mad Physicist - тогда дело нужно изменить. Код/объяснение предназначено только для того, чтобы ответить, как бинарный поиск может работать в этом случае. Я считаю, что пост сделал это. Верно?
См. более ранние комментарии @Samwise о поиске нескольких уникальных номеров.
@ Дэниел Хао. Большое спасибо за ответ. Это сделало это очень ясным.
@iOSEnthusiast, если это поможет вам, пожалуйста, проголосуйте и выберите его принятие. Спасибо
@ Дэниел Хао. Принят, но не могу проголосовать из-за репутации ниже 15.
Пожалуйста, включите ваш текущий код.