Консультация № 188654
16.01.2016, 22:50
0.00 руб.
0 3 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Андрей недавно выучил алгоритм бинарного поиска. Этот алгоритм предназначен для поиска числа в отсортированном массиве чисел. К сожалению, Андрей правильно уловил идею, но не до конца запомнил детали того, как нужно реализовывать этот алгоритм.
Реализация Андрея работает следующим образом:
поддерживается отрезок, на котором осуществляется поиск (изначально – весь массив)
следующие действия повторяются до тех пор, пока элемент не будет найден или отрезок не станет иметь нулевую длину:
выбирается элемент, находящийся в середине отрезка
если элемент равен искомому числу, алгоритм завершается
если элемент больше, чем искомое число, от отрезка оставляется только левая часть (та, что левее середины)
если элемент меньше, чем искомое число, от отрезка оставляется только правая часть (та, что правее середины)
Учитель Андрея по информатике заметил, что реализация Андрея может выполнить разное количество итераций, в зависимости от того, на какой позиции находится искомое число, в то время как правильная реализация всегда работает за одинаковое количество итераций.
Теперь Андрей хочет узнать, сколько итераций сделает его алгоритм в следующих условиях:
массив заполнен 65535 числами от 0 до 65534, каждое число встречается один раз
числа упорядочены по возрастанию
искомое число – 3000

Обсуждение

давно
Мастер-Эксперт
17387
18353
17.01.2016, 12:07
общий
Адресаты:

И совсем непонятно, к чему в условии задания это:
Цитата: Посетитель - 399097
Учитель Андрея по информатике заметил, что реализация Андрея может выполнить разное количество итераций, в зависимости от того, на какой позиции находится искомое число, в то время как правильная реализация всегда работает за одинаковое количество итераций.
Об авторе:
Facta loquuntur.
давно
Мастер-Эксперт
17387
18353
17.01.2016, 14:13
общий
это ответ
Здравствуйте, Посетитель - 399097!

По условию задания имеем
0<3000<65534 a=0 b=65534
итерация 1: (0+65534)/2=32767>3000 a=0 b=32766
итерация 2: (0+32766)/2=16383>3000 a=0 b=16382
итерация 3: (0+16382)/2=8191>3000 a=0 b=8190
итерация 4: (0+8190)/2=4095>3000 a=0 b=4094
итерация 5: (0+4094)/2=2047<3000 a=2048 b=4094
итерация 6: (2048+4094)/2=3071>3000 a=2048 b=3070
итерация 7: (2048+3070)/2=2559<3000 a=2560 b=3070
итерация 8: (2560+3070)/2=2815<3000 a=2816 b=3070
итерация 9: (2816+3070)/2=2943<3000 a=2944 b=3070
итерация 10: (2944+3070)/2=3007>3000 a=2944 b=3006
итерация 11: (2944+3006)/2=2975<3000 a=2976 b=3006
итерация 12: (2976+3006)/2=2991<3000 a=2992 b=3006
итерация 13: (2992+3006)/2=2999<3000 a=3000 b=3006
итерация 14: (3000+3006)/2=3003>3000 a=3000 b=3002
итерация 15: (3000+3002)/2=3001>3000 a=3000 b=3000
итерация 16: (3000+3000)/2=3000 искомое число найдено
Значит, алгоритм, предложенный Андреем, выполнит 16 итераций.

С уважением.
Об авторе:
Facta loquuntur.
давно
Мастер-Эксперт
17387
18353
23.01.2016, 17:28
общий
Адресаты:
Здравствуйте, уважаемый посетитель!

Как и любой другой эксперт, я тоже человек. И мне хотелось бы знать Ваше мнение по поводу полученных Вами моих ответов на Ваши вопросы. Эти ответы Вы получили совершенно бесплатно (если не учитывать Ваши затраты на оплату трафика)...

Если Вас устраивает игра "в молчанку", то это плохо для нашего портала. Отсутствие обратной связи не способствует его развитию.

Вы отмалчиваетесь, как правило, и в мини-форумах созданных Вами консультаций. Это Ваш принцип? Тогда я, скорее всего, буду игнорировать Ваши вопросы. Пусть это несколько по-детски.
Об авторе:
Facta loquuntur.
Форма ответа