2016-01-31 3 views
4

Я прибегая к помощи двоичного поиска в питоне, и я нашел это: http://openbookproject.net/thinkcs/python/english3e/list_algorithms.htmlPython двоичного поиска (максимальное число итераций)

Это говорит о том, что общее соотношение между макс. числа итераций (то же, что и Probe справа?) и N (размер списка) задается N = 2^k -1, где k - максимальное количество итераций.

Однако из моего понимания, если не вообще отношения быть N = 2^k
Поскольку каждый раз после поиска, мы разделили бы из списка на 2, пока мы не получим до 1.

Поэтому максимальное число итераций is log2 N вместо log2 (N+1)

У меня есть googled это, и я нашел, что один сайт поддерживает мой ответ, но без особого объяснения. (ссылка здесь: http://codingexplained.com/coding/theory/binary-search-algorithm)

Может ли кто-то объяснить математику позади нее? Благодарю.

+2

«каждый раз после поиска мы разделим список на 2, пока не получим 1 ». Нет: в реализации вы ссылаетесь, каждая итерация * удаляет один элемент списка из рассмотрения *, а затем уменьшает область интереса ко всему либо справа, либо слева от этого элемента. И для конкретности, вы должны думать о «зонде» как поиске списка ('xs [mid_index]'), а не о итерации. –

ответ

2

Позвольте P(n) быть числом зондов, необходимых для n элементов. Тогда можно записать следующее уравнение:

P(0) = 0 
P(n) = 1 + P((n-1)/2) 

Объяснение: Сначала мы не имеем никаких элементов - ничего не делать. Затем мы делаем 1 зонд, и мы остаемся с (n-1)/2 элементами (мы бросаем 1 прочь, потому что мы только что проверили его), поэтому нам нужно сделать P((n-1)/2).

Результат для P(n) из этого уравнения будет floor(lg(n+1)). Вы можете проверить это на некоторых примерах (например, n = 6 и n = 7), или вы можете прочитать о том, как решать рекурсивные уравнения

+1

Второе уравнение должно быть действительно «P (n) = 1 + P (n // 2)»: например, рассмотрим случай «n = 6» - выберем «средний» элемент, оставив 2 элемента в одну сторону и 3 - к другому; в худшем случае мы заканчиваем тем, что сводим к тем 3 элементам, поэтому хотим, чтобы уравнение заканчивалось как «P (6) = 1 + P (3)». (Первый случай, когда он имеет значение, равен «n = 2', мы должны иметь« P (2) = 2'.) –

+0

Я думаю, что вы правы, но это даст другой результат. Возможно, в этой статье есть ошибка? – Dunno

+0

Я не думаю, что в этой статье есть ошибка. С '1 + P ((n-1)/2)' вы получаете что-то, что * не согласуется * с тем, что в статье, как я уже указывал для 'P (2)'. (Для 'P (2)' вы должны получить 'ceil (log2 (3))', который равен '2', но с вашим определением вы получите' P (2) = 1'.) Если вы измените '(n-1)/2' to 'n // 2', то ваше определение согласуется со статьей. Какую часть статьи вы считаете ошибочной? –