Песни о Паскале - [88]

Шрифт
Интервал

1010
833977045
9402188710
1087158159
116811539
12595914110
139288597
1432952610
15953493510
16161886
1710661058
18708198910
192182909
20692795210
Среднее количество шагов4559

Что вы скажете об этом? Двоичный поиск дал превосходный результат, – любое число находится не более чем за 10 шагов! Это любопытно, и побуждает разобраться в алгоритме глубже.

Ах, время, время!

Принимаясь за что-либо, мы прикидываем, сколько времени займет то или иное дело. Поиск может отнять уйму времени, вот почему важно оценить его трудоемкость. Сравним алгоритмы поиска по затратам времени. Только время будем измерять не секундами, а особыми единицами – шагами поиска. Почему? Да потому, что у нас с вами разные компьютеры. Поскольку ваш «станок» мощнее, ту же работу он выполнит быстрее моего, а это нечестно! Мы ведь алгоритмы сравниваем, а не процессоры.

Если улыбнется удача, поиск завершится на первом шаге. Иногда – по закону подлости – тратится максимальное число шагов. Но эти крайние случаи – редкость; обычно поиск занимает какое-то промежуточное время, и наш эксперимент подтвердил это. Программистов интересует время поиска в двух случаях: в худшем, и в среднем (то есть, усредненное по многим случаям).

Начнем с линейного поиска. Очевидно, что в массиве из N элементов худшее время поиска составит N шагов. Что касается среднего времени, то чутье подсказывает, что оно составит половину максимального времени, то есть N/2. Судите сами: искомое число с равной вероятностью может оказаться и ближе и дальше середины массива. Табл. 7 подтверждает эту догадку, – среднее количество шагов там составило 455, что очень близко к значению 1000/2.

Теперь рассмотрим двоичный поиск. Вначале оценим худшее время. Рассудим так. Сколько шагов поиска нужно в массиве из одного элемента? Правильно, один. А теперь вспомним, что при двоичном поиске всякий раз отбрасывается половина оставшегося массива. Значит, посчитав, сколько раз число N делится пополам для получения единицы, мы определим максимальное число шагов. Так и поступим; следите, честно ли я «распилил» нашу тысячу.

1. 1000 / 2 = 500

2. 500 / 2 = 250

3. 250 / 2 = 125

4. 125 / 2 = 62

5. 62 / 2 = 31

6. 31 / 2 = 15

7. 15 / 2 = 7

8. 7 / 2 = 3

9. 3 / 2 = 1

При делении я отбрасывал дробную часть, поскольку в двоичном алгоритме так и делается. Всего потребовалось 9 операций деления. Это значит, что максимальное число шагов поиска равно 10 (с учетом поиска в одном оставшемся элементе). Удивительная прозорливость, – ведь наш эксперимент (табл. 7) показал то же самое!

Теперь оценим среднее время двоичного поиска. Думаете, что оно составит 10/2 = 5 шагов? Как бы ни так! Дело в том, что любой алгоритм поиска в среднем исследует половину массива. Двоичный поиск отбрасывает половину массива на первом же шаге. А это значит, что в среднем число шагов будет всего лишь на единицу меньше худшего, то есть 9. Смотрим в табл. 7, – точно! Наша догадка подтвердилась! Таким образом, двоичный поиск не только быстрее линейного, но и более предсказуем: его худшее время почти не отличается от среднего.

Логарифмы? Это просто!

Разобравшись с тысячей элементов, оценим трудоемкость двоичного поиска при других размерах массива. Метод оценки остается тем же: делим размер массива пополам до получения единицы.

Для таких вычислений математики придумали особую функцию – логарифм (не путайте её с рифмой, ритмом и алгоритмом!). Логарифмы бывают разные: десятичные, натуральные и прочие. Нам интересен двоичный логарифм, который по-научному называется так: «логарифм числа N по основанию два». Математики записывают его следующим образом:

Log>2 N

Связь между числом N и его двоичным логарифмом легко проследить на следующих примерах. Слева представлено разложение на множители нескольких чисел, а справа – двоичные логарифмы этих же чисел.

4 = 2 • 2 Log>2 4 = 2

16 = 2 • 2 • 2 • 2 Log>2 16 = 4

64 = 2 • 2 • 2 • 2 • 2 • 2 Log>2 64 = 6

Итак, двоичный логарифм числа равен количеству двоек (ой, нехорошее слово!), перемножаемых для получения этого числа. Например, для получения числа 8 надо перемножить три двойки, и его логарифм равен трем. Кстати, для получения единицы из восьмерки, её тоже «пилят» пополам трижды. Значит, оба способа вычисления логарифма – через умножение, и через деление – равноценны.

Если вы завтра же не забросите программирование, то табл. 8 с логарифмами нескольких чисел ещё пригодится вам.

Табл. 8 – двоичные логарифмы некоторых чисел

NLog>2 NNLog>2 NNLog>2 NNLog>2 N
213255129819213
426461024101638414
8312872048113276815
16425684096126553616

По таблице можно оценить как среднее, так и худшее время двоичного поиска: среднее время равно двоичному логарифму от размера массива, а худшее – на единицу больше.

А как определить логарифмы других чисел, например, числа 50? Поскольку оно лежит между 32 и 64, его логарифм должен быть где-то между 5 и 6? Так оно и есть: логарифм 50 равен приблизительно 5,64 (это я на калькуляторе посчитал). Но, поскольку мы применяем логарифмы для подсчета шагов поиска, то погрешностью в доли шага можно пренебречь. К чему мелочиться? Будем считать, что логарифм числа 50 тоже равен 6. Мало того, назначим это значение логарифма всем числам в промежутке от 33 до 64.


Рекомендуем почитать
Сказки на ночь. Всем хочется на бал

Формула чудес такова: один слушатель в возрасте до шести лет, один чтец, возраст упустим, с интерсными взглядами на жизнь и чувтсвом юмора, хорошее классическое чтиво в современной интерпретации. Правильные слова — и вот вам чудеса и приключения: брутальные принцы, моложавые короли, вредные феи-крестные, злопамятные мачехи и многие другие личности. Готовьте тыкву, мы собираемся на бал!


Ряска Правды

Люди до смерти боятся нечисти, обходят болото стороной. Нечисть, в свою очередь, презрительно фыркает, воротит нос и выбираться из чащоб не спешит. Впрочем, везде встречаются мечтатели — неправильную кикимору по имени Златеника тянет прочь, на свободу. Когда на берегу болота откуда ни возьмись является очаровательный принц, Ника принимает его деловое предложение. Вот только болото не отпускает так просто. Да и люди так просто не принимают. Во дворце гадюк больше, чем на топи. А если ещё и помочь темному магу…


Новороссия. Год войны

Предлагаемая книга посвящена событиям в Новороссии. Её героям и её жертвам. Предпринята попытка подробно рассмотреть первый год донбасской войны, от государственного переворота в Киеве до подписания вторых Минских соглашений. Читатель сможет ближе познакомиться с геополитической и экономической подоплёкой украинской трагедии, давшей старт очередной попытке Запада развалить и колонизировать Россию.


Оверклокеры

Их девиз – «ничто не истинно, всё дозволено». Они оперируют самой конвертируемой валютой в мире – лайком – и практически круглосуточно находятся онлайн. Пионеры новой эры синтеза человека и компьютера, они не видят смысла своей жизни без гаджетов и Интернета, порой даже не догадываясь, что страдают зачастую неизлечимыми психическими расстройствами. И уж тем более не подозревают, какую жертву в будущем им придётся принести на алтарь собственного тщеславия. Их много, и имя им – Оверклокеры.


Прикосновение Прошлого

Девушка-подросток имеет необычную способность. Касаясь ладонью человека, она видит его прошлое. Она влюблена в популярного парня в школе и вскоре узнает его прошлое, где много боли . Сможет ли она изменить его? Поможет ли ему стать самим собой? Полюбит ли он ее?(Черновик)


Маргаритка под снегом

Вы бывали в Калининграде? Город мистический и старый. Но не это главное. То что происходит с главной героиней не объясняется древними стенами. За ней гоняется призрак погибшего мотоциклиста. Зачем? Почему?. Рита узнает все и будет счастлива.