Чаще всего подход «разделяй и властвуй» используют из-за того, что он обеспечивает более быстрые решения, чем простые итерационные алгоритмы.

Для проверки рекурсивной программы, сам код предполагает проверку правильности вычисления методом математической индукции:

Он явно и немедленно отыскивает максимальный элемент массива, размер которого равен 1.

Для N>1 код разделяет массив на два, размер каждого из которых меньше N, исходя из индуктивного предположения, находит макс. эл-ты в обеих частях и возвращает большее из этих двух значений, которое должно быть максимальным значением для всего массива.

Лемма Рекурсивная функция, которая разделяет задачу размерности N на две независимые (непустые) решающие ее части, рекурсивно вызывает себя менее N раз.

Лемма. Бинарный поиск исследует не более lgN +1 чисел.

Бинарный поиск позволяет решить большую задачу с 1 миллионом чисел при помощи 20 сравнений.

Нерекурсивный алгоритм двоичного поиска.

Начало

       Установить левую границу поиска =1;

       Установить правую границу поиска =N;

       Пока левая граница <= правой

               Нц

               Найти середину области поиска m:=(l+r)/2;

               Если искомое число <а[m], то  изменить правую границу R:=m-1;

               Если искомое число >а[m], то изменить левую границу L:=m+1;

НЕ нашли? Не то? Что вы ищете?

               Если искомое число =а[m], то искомое число найдено.

               Кц

       Сообщить, что искомого числа в массиве нет.

Рекурсивный алгоритм двоичного поиска.

Алгоритм Двоичный поиск (l, r)

Начало

       Если левая граница <= правой, то

               Нц

               Найти середину области поиска m:=(l+r)/2;

               Если искомое число <а[m], то  Двоичный поиск (l, m-1);

               Если искомое число >а[m], то Двоичный поиск (m+1,r)

               Если искомое число =а[m], то искомое число найдено.

               Кц

       Иначе Сообщить, что искомого числа в массиве нет.

Применение алгоритма «разделяй и властвуй» для отыскания максимального из N элементов массива а[1..n]. Не рекурсивный алгоритм решает задачу за один проход. Используемые обозначения:L– левая граница, R-правая граница, M-средний элемент.

Рекурсивный алгоритм нахождения макс. элемента.

Алгоритм  Макс (а, l,r)

Начало

       Если левая граница <= правой, то

               Нц

               Найти середину области поиска m:=(l+r)/2;

               U:= Макс (а, l,m);

               V:= Макс (а, m+1,r)

               Если u>v то Макс:= u, иначе Макс:= v

               Кц

Многие алгоритмы типа «разделяй и властвуй» имеют одинаковую рекурсивную структуру: CN = 2*CN/2 + N, где N>=2 и C1 =0.

Некоторые алгоритмы типа «разделяй и властвуй» могут выполнять различный объем вычислений для различных вызовов функций, время выполнения таких алгоритмов зависит от конкретного способа разделения на части. В случае, когда задача делится пополам, а затем  алгоритм работает только с одной половиной (сумма размеров частей равна общей размерности) – время выполнения линейно связано с количеством вызовов. Другие алгоритмы типа «разделяй и властвуй» могут разделять задачу  на части, сумма размеров которых меньше или больше размерности всей задачи. Эти алгоритмы все же относятся к алгоритмам типа «разделяй и властвуй», поскольку каждая часть меньше целого, но анализировать их труднее.

Бинарный поиск элемента, равного у в упорядоченном массиве

Оператор цикла «Пока»

L:=1;

R:=n;

Found:=false;

Result:=-1;

       While (l<=r) и not found

       do

       начало

                       Mid:=round((l+r)/2);

               Если a[mid]=y

               то начало result:=mid; found:=true конец

               иначе

                               Если y<a[mid]

                               то  r:=Mid-1

                               иначе  l:=Mid+1;

       конец;

       Если found

       то  Write(' Search digit found in massiv at number ',result)

       иначе Write(' Search digit not found in massiv ');

Оператор цикла «Повторять»

l:=1;

r:=n;

Found:=false;

Result:=-1;

       Повторять

               Mid:=trunc(((l-r)/2)+r);

               Если a[mid]=y

                       то

начало

found:=true;

result:=mid;

конец

                       иначе

                               Если y<a[mid]

                               то  r:=Mid-1

                               иначе  l:=Mid+1;

       До (l>r) or found;

       Если found

       то        Write(' Search digit found in massiv at number ',result)

       иначе        Write(' Search digit not found in massiv ');

Рекурсивный алгоритм

Алгоритм BS

Входl, r int;

Выход a:tarray; number int; flag:char;

Локальные переменные m int;

начало

Если l<=r то

начало

               m:=round((r+l)/ 2) ;

               Если x=a[m]

               то

                       начало

                               number:=m;

                               flag:=true;

                       конец;

               Если x<a[m]

                       то Bs(l, m-1,number, flag)

                       иначе Bs(m+1,r, number, flag)

конец;

конец;

BS(1,8,number, flag);

Если flag то

Write(' Search element ',number)

иначе Вывод (' El not found');


Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4