Читать онлайн «Алгоритмы на C++»

Автор Роберт Седжвик

Р. СIЩЖ ВИК АлГОРIml<Ы на С ++ Рис. 5. 9. Двоич ный подсчет и функция рисования линейки Вычисление функции рисования линейки эквивалентно под счету количества оконечных нулей в четных N -разрядны х числах. Программа 5. 9 - альтернативный способ рисования линейки , на который натолкнуло соответствие с двоичными числами (см. рис . 5. 10). Эту версию алгоритма называют восходящей (bottom -up) реализацией. Она не является рекурсивной, но определенно навеяна рекурсивным алгоритмом. Эта связь между ал горитмами "разделяй и властвуй " и двоичными пр едставлениями чисел часто помогает найти решение при анализе и р азработке усовершенствованны х версий , таких как восходящие подходы. Мы будем рассматривать данную возможность , чтобы понять и, возможно , усоверше нс твовать каждый рассматриваемый алгоритм вида ' 'разделяй и властвуй ". Восходящий подход предполагает изм ене ни е порядка выполнения вычислений при рисовании л ин ейки. На рис. 5. 11 показан еще один при мер , в котором изменен порядок следования трех вызовов функций в рекурсивной реализации.
Этот прим ер соответствует рекурсивному рисованию первоначально описанным способом: нанесение средней метки, затем левой половины, а затем правой. Последовательность нан есения меток выглядит сложной , но является результатом простой п еремены мест двух операторов в прогр амме 5. 8. Как будет показано в разд еле 5. 6, взаимосвязь междУ ри с. 5. 8 и рис . 5. 11 срадни различию между постфиксными и пр ефиксными арифметическими выражениями. Программа 5. 9. Нерекурсивная программа для рисования л ин ейки В отличие от про граммы 5. 8, линейку можно нарисовать, вначале и зобраз ив все метки длиной 1, затем все метки длиной 2 и т. д. Переменная t пр едставляет длину меток, а переменная j - количество меток между д вумя последовательными метками дли ной t. Внешний циЮl for увеличивает значение t при сохранении соотноше ния j = 2 -1 .