Я слышал, как кто-то сказал, что поскольку бинарный поиск делит пополам входные данные, необходимые для поиска, то это алгоритм log (n). Так как я не имею математического образования, я не могу иметь к нему отношение. Может кто-нибудь объяснить это немного подробнее? это имеет отношение к логарифмической серии?
algorithm
search
time-complexity
binary-search
Кролик кролик
источник
источник
Ответы:
Здесь более математический способ увидеть это, хотя и не очень сложно. ИМО намного понятнее, чем неформальные:
Вопрос в том, сколько раз вы можете разделить N на 2, пока не получите 1? По сути, это говорит о том, что бинарный поиск (половина элементов), пока вы не нашли его. В формуле это будет так:
умножить на 2 х :
Теперь сделайте журнал 2 :
это означает, что вы можете разделить журнал N раз, пока у вас все не будет разделено. Это означает, что вы должны делить log N («выполнить бинарный поиск»), пока не найдете свой элемент.
источник
Для двоичного поиска T (N) = T (N / 2) + O (1) // рекуррентное соотношение
Применить теорему Мастера для вычисления сложности времени выполнения рекуррентных соотношений: T (N) = aT (N / b) + f (N)
Здесь a = 1, b = 2 => log (база b) = 1
также здесь f (N) = n ^ c log ^ k (n) // k = 0 & c = log (основание b)
Итак, T (N) = O (N ^ c log ^ (k + 1) N) = O (log (N))
Источник: http://en.wikipedia.org/wiki/Master_theorem
источник
Т (п) = Т (п / 2) + 1
T (n / 2) = T (n / 4) + 1 + 1
Поместите значение The (n / 2) выше, чтобы T (n) = T (n / 4) + 1 + 1. , , , Т (п / 2 ^ к) + 1 + 1 + 1 + 1 .....
= T (2 ^ k / 2 ^ k) + 1 + 1 .... + 1 до k
= Т (1) + K
Как мы взяли 2 ^ k = n
K = log n
Таким образом, сложность Времени O (log n)
источник
Это не половина времени поиска, это не сделало бы это log (n). Это уменьшает это логарифмически. Задумайтесь об этом на мгновение. Если у вас 128 записей в таблице и вам нужно искать значение линейно, то, вероятно, потребуется около 64 записей в среднем, чтобы найти ваше значение. Это н / 2 или линейное время. При бинарном поиске вы устраняете 1/2 возможных записей на каждой итерации, так что самое большее потребуется всего 7 сравнений, чтобы найти ваше значение (логарифмическая база 2 из 128 равна 7 или 2, а степень 7 равна 128). сила бинарного поиска.
источник
Временная сложность алгоритма двоичного поиска принадлежит классу O (log n). Это называется большой обозначение O . То, как вы должны интерпретировать это, заключается в том, что асимптотическое увеличение времени выполнения функции при заданном входном наборе размера n не будет превышать
log n
.Это просто формальный математический жаргон для того, чтобы иметь возможность доказывать утверждения и т. Д. Он имеет очень простое объяснение. Когда n становится очень большим, функция log n будет увеличивать время, необходимое для выполнения функции. Размер «входного набора», n, это просто длина списка.
Проще говоря, причина бинарного поиска в O (log n) состоит в том, что он вдвое сокращает входной набор в каждой итерации. Проще думать об этом в обратной ситуации. На x итерациях, какой длинный список может проверить алгоритм двоичного поиска в max? Ответ 2 ^ х. Отсюда видно, что наоборот, в среднем алгоритму двоичного поиска требуется log2 n итераций для списка длины n.
Если, почему это O (log n), а не O (log2 n), то это потому, что, проще говоря, снова - Использование больших констант обозначений O не считается.
источник
Вот запись в википедии
Если вы посмотрите на простой итеративный подход. Вы просто удаляете половину элементов для поиска, пока не найдете нужный элемент.
Вот объяснение того, как мы придумали формулу.
Скажем, сначала у вас есть N элементов, а затем в качестве первой попытки вы делаете «N / 2». Где N - сумма нижней границы и верхней границы. Первое значение времени N будет равно (L + H), где L - первый индекс (0), а H - последний индекс списка, который вы ищете. Если вам повезет, элемент, который вы попытаетесь найти, будет посередине [например, Вы ищете 18 в списке {16, 17, 18, 19, 20}, затем вычисляете ⌊ (0 + 4) / 2⌋ = 2, где 0 - нижняя граница (L - индекс первого элемента массива) и 4 - верхняя граница (H - индекс последнего элемента массива). В приведенном выше случае L = 0 и H = 4. Теперь 2 - это индекс найденного элемента 18, который вы ищете. Бинго! Ты нашел это.
Если бы случай был другим массивом {15,16,17,18,19}, но вы все еще искали 18, то вам не повезло, и вы бы сначала делали N / 2 (то есть ⌊ (0 + 4) / 2⌋ = 2 и затем поймите, что элемент 17 в индексе 2 - это не искомое число. Теперь вы знаете, что вам не нужно искать по крайней мере половину массива при следующей попытке поиска итеративным образом. усилия по поиску уменьшаются вдвое, так что, по сути, вы не ищите половину списка элементов, которые вы искали ранее, каждый раз, когда вы пытаетесь найти элемент, который вы не смогли найти в предыдущей попытке.
Так что худший случай будет
пока ... вы не закончили поиск, где элемент, который вы пытаетесь найти, находится в конце списка.
Это показывает худший случай, когда вы достигаете N / 2 x, где x таков, что 2 x = N
В других случаях N / 2 x, где x таков, что 2 x <N Минимальное значение x может быть 1, что является наилучшим случаем.
Теперь, поскольку математически наихудший случай - это когда значение
2 x = N
=> log 2 (2 x ) = log 2 (N)
=> x * log 2 (2) = log 2 (N)
=> x * 1 = log 2 (N)
=> Более формально ⌊log 2 (N) + 1⌋
источник
Log2 (n) - максимальное количество поисков, которое требуется, чтобы найти что-то в двоичном поиске. Средний случай включает в себя log2 (n) -1 поисков. Вот больше информации:
http://en.wikipedia.org/wiki/Binary_search#Performance
источник
Допустим, итерация в бинарном поиске заканчивается после k итераций. На каждой итерации массив делится пополам. Итак, скажем, длина массива на любой итерации равна n На итерации 1,
На итерации 2
На итерации 3
Следовательно, после итерации k
Также мы знаем, что после k делений длина массива становится равной 1, поэтому
Применение функции журнала с обеих сторон:
Следовательно,
Следовательно, временная сложность бинарного поиска
источник
Бинарный поиск работает путем разделения задачи пополам несколько раз, что-то вроде этого (подробности опущены):
Пример поиска 3 в [4,1,3,8,5]
Это би -nary поиск , когда вы делите задачу 2.
Поиск требует только log2 (n) шагов, чтобы найти правильное значение.
Я бы порекомендовал Введение в алгоритмы, если вы хотите узнать об алгоритмической сложности.
источник
Поскольку мы сокращаем список вдвое каждый раз, нам просто нужно знать, сколько шагов мы получаем 1, так как мы продолжаем делить список на два. В приведенном ниже расчете x обозначает число раз, когда мы делим список, пока не получим один элемент (в худшем случае).
1 = N / 2x
2x = N
Принимая log2
log2 (2x) = log2 (N)
x * log2 (2) = log2 (N)
x = log2 (N)
источник
Т (Н) = Т (Н / 2) + 1
T (N) = T (N / 2) + 1 = (T (N / 4) + 1) + 1
...
T (N) = T (N / N) + (1 + 1 + 1 + ... + 1) = 1 + logN (база 2 log) = 1 + logN
Таким образом, временная сложность бинарного поиска составляет O (logN)
источник
источник
Позвольте мне упростить для всех вас пример.
Для простоты предположим, что в массиве есть 32 элемента в отсортированном порядке, из которых мы ищем элемент с помощью бинарного поиска.
1 2 3 4 5 6 ... 32
Предположим, что мы ищем 32. после первой итерации мы останемся с
17 18 19 20 .... 32
после второй итерации мы останемся с
25 26 27 28 .... 32
после третьей итерации мы останемся с
29 30 31 32
после четвертой итерации мы останемся с
31 32
На пятой итерации мы найдем значение 32.
Итак, если мы преобразуем это в математическое уравнение, мы получим
(32 X (1/2 5 )) = 1
=> n X (2 -k ) = 1
=> (2 k ) = n
=> k log 2 2 = log 2 n
=> k = log 2 n
Отсюда и доказательство.
источник
Вот решение, использующее основную теорему, с читаемым LaTeX.
Для каждого повторения в отношении повторения для двоичного поиска мы преобразуем задачу в одну подзадачу со временем выполнения T (N / 2). Следовательно:
Подставляя в основную теорему, получаем:
Теперь, поскольку 0 и f (n) равно 1, мы можем использовать второй случай основной теоремы, потому что:
Это означает, что:
источник