Сетевой подход к оценке трудоемкости алгоритмов
Сетевой подход удобен для анализа вручную и позволяет вычислять среднюю, минимальную и максимальную трудоемкость алгоритма на графах, не содержащих циклы. Для примера рассмотрим граф алгоритма, изображенный на рис.4. Воспользовавшись формулой (4) для рис.4 можем записать:
n0 = 1 ;
n1 = 1 * n0 = 1 ;
n2 = 0.5 * n1 = 0.5 ;
n4’ = 0.5 * n1 = 0.5 ;
n5’ = n4’ + 0.6n2 = 0.5 + 0.6 * 0.2 = 0.8 ;
n3’ = 0.4n2 + 0.25n5’ = 0.4 * 0.5 + 0.25 * 0.8 =0.4 ;
n6 = n3’ + 0.75n5’ = 0.4 + 0.75 * 0.8 = 1 ;
n7’ = 1 * n6 =1 .
За счет отсутствия циклов система оказывается легко разрешимой. Затраты времени на анализ могут быть снижены дополнительно, если ввести эффективную нумерацию состояний графа алгоритма. Последняя заключается в том, что номер вершины должен быть таким, чтобы входящие в эту вершину дуги начинались в вершинах с меньшими номерами. Если после такой нумерации уравнения записывать в порядке возрастания их номеров, то они будут сразу решаться, так как неизвестные с меньшими номерами будут уже вычислены. В приведенном примере нумерация вершин не соответствует указанному требованию, но уравнения записывались в порядке их решения.
При наличии в графе алгоритма циклов последние следует заменить операторами с эквивалентной трудоемкостью. Если в графе алгоритма имеются циклы в цикле, то, очевидно, первоначально следует заменить эквивалентными операторами внутренние циклы, а затем переходить к замене внешних циклов. Расчет трудоемкости алгоритма выполняется по вышеприведенной методике.
Обозначим через pc вероятность замыкания цикла, т. е. вероятность перехода по дуге из конца цикла в его начало. Тогда в соответствии с выражением (4) можно записать :
nc = 1 + pcnc , (6)
где nc - среднее число повторений цикла.
Из выражения (6) имеем:
(7)
Тогда среднее число процессорных операций цикла будет равно :
kc = nckтс ,
где kтс - средняя трудоемкость тела цикла;
kс - средняя трудоемкость цикла.
Среднее число обращений к файлам и среднее количество информации, передаваемое при обращении в цикле к файлам, определяется аналогично.
Рассмотрим пример.
В алгоритме на рис.3 имеется два цикла. Первый содержит операторы V3,V4,V5, а второй состоит только из оператора V7. Первый цикл усложнен входами внутрь цикла из операторов V1 и V2 . Для избавления от входов в цикл не через начало цикла V3 произведем элементарные преобразования графа алгоритма. Эквивалентный граф после очевидных преобразований изображен на рис.5. Из рис.5 следует, что операторы V4 и V5 , которые использовались для входа в тело цикла не через его начало, вынесены отдельно под номерами 4’ и 5’.
Количество повторений циклов из выражения (7) равно :
где nc1, nc2 - число повторений первого и второго циклов.
Граф алгоритма без циклов приведен на рис.4.
Вышеприведенный подход позволяет вычислить среднюю трудоемкость алгоритма. Для оценки максимальной и минимальной трудоемкости алгоритма необходимо перебрать все возможные пути, ведущие из начальной вершины графа алгоритма в конечную, и выбрать из них пути, дающие максимальную и минимальную трудоемкость. Следует учесть, что, например, путь с минимальным количеством процессорных операций может иметь не минимально возможное число обращений к файлам. При наличии циклов в графе алгоритма для тела цикла определяется минимальная и максимальная трудоемкость. Находится минимальное и максимальное число повторений цикла и формируются соответствующие эквивалентные по трудоемкости операторы.
В качестве примера оценим минимальное и максимальное число процессорных операций для графа алгоритма, изображенного на рис.4. Для упрощения примем, что все операторы имеют трудоемкость, равную 1000 процессорных операций. Через Ai и Bi будем обозначать соответственно минимальное и максимальное число процессорных операций, которое будет иметь место в момент выхода процесса из i-й вершины графа.
A0 = 0; B0 = 0;
A1 = min(A0) + 1000 = 1000; B1 = max(B0) + 1000 = 1000;
A2 = min(A1) + 1000 = 2000; B2 = max(B1) + 1000 = 2000;
A4’ = min(A1) + 1000 = 2000; B4’ = max(B1) + 1000 = 2000;
A5’ = min(A2,A4’) + 1000 = 3000; B5’ = max(B2,B4’) + 1000 = 3000;
A3’ = min(A2,A5’) + 1000 = 3000; B3’ = max(B2,B5’) + 1000 = 4000;
A6 = min(A3’,A5’) + 1000 = 4000; B6 = max(B3’,B5’) + 1000 = 5000;
A7 = min(A6) + 1000 = 5000; B7 = max(B6) + 1000 = 6000.