Способы снижения вычислительной 6 сложности алгоритмов

advertisement
6 Способы снижения вычислительной
сложности алгоритмов
Под способами снижения вычислительной сложности будем понимать
совокупность эвристических приемов модификации алгоритмов,
которые приводят в определённых случаях к удалению лишних
вычислений или замене операций на более эффективные.
Применяя способы снижения вычислительной сложности,
необходимо оценить их эффективность (степень снижение
вычислительной сложности алгоритма) и условия возможности
реализации.
Трансформация осуществляется заменой фрагмента или совокупности
фрагментов алгоритма. Она должна быть корректной, т. е.
сохранять эквивалентность исходного и полученного алгоритмов и
удовлетворять контекстным условиям на требуемые свойства
объектов алгоритма и/или связи заменяемого фрагмента с
остальной частью алгоритма.
Исходный и преобразованный алгоритмы эквивалентны, если на всех
допустимых наборах входных данных задачи дают одинаковые
результаты. Контекстными условиями являются, например, проверка
наличия в алгоритме операторов и/или объектов, позволяющих
использовать заменяющий фрагмент.
1
Способы снижения вычислительной
сложности алгоритмов
Синтез заменяемого и заменяющего фрагментов является
творческой задачей. Для успешного её решения необходимо
знание дискретной математики, в том числе теории множеств,
математической логики, теории графов, методов и алгоритмов
решения задач дискретного программирования. Исходными
данными для этой задачи являются результаты анализа
процесса преобразования модели исходного представления
проектируемой структуры в модель результата, сущности,
свойств и количества операций над объектами алгоритма,
свойств и характеристик этих объектов.
2
Способы снижения вычислительной сложности
алгоритмов
Вычислительная сложность алгоритма зависит от :
•
корректности формальной постановки задачи;
•
метода решения задачи;
•
операций преобразования модели исходного описания объекта
проектирования;
•
свойств и характеристик графов;
•
формы представления графа множествами;
•
способа задания множества (подмножества);
•
структур данных для представления множеств и графов.
3
Классификация способов снижения
вычислительной сложности алгоритмов
Способы снижения вычислительной сложности алгоритмов
1
Связанные с
корректностью
формальной
постановки
задачи
2
Зависящие
от метода
решения
задачи
3
Вытекающие
из принципа
формирования
решения
4
Определяемые
способами
задания
множеств и
графов
5
Связанные со
свойствами и
характеристиками
графов
6
Определяемые
свойствами
операций над
предикатами и
множествами
5.1
Реализуемые
выбором
операций
преобразования
графа
6.1
Связанные со
свойствами
множеств и
операций над ними
5.2
Заключающиеся
в исключении
повторных
расчётов
6.2
Использующие
предикаты и
операции над
ними
4
Корректность формальной постановки задачи и
выбор метода решения
Под корректностью постановки задачи понимается исключение из
области допустимых решений вариантов, не удовлетворяющих её
ограничениям. Он основан на том, что ограничения, вытекающие из
структуры и, возможно, метрики графа решений, должны
учитываться генератором возможных решений, что позволит не
создавать варианты, заведомо не являющиеся решением. Примером
может служить рассмотренные ранее две постановки задачи
построения минимального остовного дерева.
Способ применяется на этапе постановки задачи и является чисто
творческим, вследствие чего возможность его формализации
проблематична, хотя его вклад в снижение вычислительной и
емкостной сложности может быть весьма существенным.
Выбор метода решения требует от разработчика анализа класса
задачи, требований к точности её решения и имеющихся
вычислительных ресурсов.
Этот способ также относится к творческим.
5
Выбор операции преобразования
Способ декларирует выбор эффективных операций при формировании
решений.
Так, задачу построения минимального остовного дерева можно решать
удалением ребер максимальной длины из заданного графа Gисх (X,
U) или добавлением ребер минимальной длины в граф G0(X, ).
• удаление ребра допустимо, если граф сохраняет связность,
проверка связности графа выполняется алгоритмом свертки со
сложностью O(n). С учетом того, что количество удаляемых ребер
k = m-n+1, где m = n(n-1)/2, асимптотическая оценка вычислительной
сложности алгоритма O(n3).
• добавление ребра допустимо, если при этом не образуется цикл,
что для ребра u(xi, xj), в котором xiX′, где X′ – множество вершин
строящегося дерева до присоединения к нему ребра u(xi, xj), требует
проверки условия xjX′. С учетом того, что количество добавляемых
ребер равно n-1, в итоге получаем оценку O(n2), а при представлении
X′ характеристическим вектором – O(n).
Таким образом, вклад данного способа в снижение вычислительной
сложности также весьма существенен, но его формализация требует
построения довольно сложных эвристик и наличия информации о 6
вычислительной сложности процедуры проверки связности графа.
Способы снижения вычислительной сложности
алгоритмов (1)
Кроме выбора способов задания графовой модели множествами и
структур данных для их представления, существует еще несколько
способов снижения вычислительной и емкостной сложности
алгоритмов, связанные с принципом формирования решения,
свойствами и характеристиками графов. Рассмотрим некоторые из
них:
1) использование рекуррентных процедур для определения состава
множеств, элементы которых в результате выполнения
преобразований меняются частично;
2) применение рекуррентных формул для расчета критериев и/или
оценочных функций;
3) исключение повторного расчета критериев и/или оценочных
функций в тех случаях, когда они в результате выполненного
преобразования модели не меняются;
4) исключение подсчета критериев и/или оценочных функций для тех
компонентов графов, для которых предикат определяющего
отношения принимает значение «ложь» (алгоритм свертки и
итерационный алгоритм компоновки);
7
Способы снижения вычислительной сложности
алгоритмов (2)
5) замена объединения множеств конкатенацией, если объединяемые
множества не пересекаются. Способ базируется на том, что при
объединении непересекающихся подмножеств нет необходимости
проверять совпадают ли их элементы. Т. е. из A  B =   A  B = A
. B, что позволяет снизить вычислительную сложность этой
операции с O(n2) до O(n) при представлении множеств векторами и
до O(1) при представлении списками с указателями их начала и
конца. Следует однако помнить, что во втором случае множество B
не сохраняется;
6) использование предикатов или соответствующих им отношений
для формального задания таких связей между множествами и / или
их элементами, которые позволяют снизить вычислительную
сложность операций над ними.
8
Способы снижения вычислительной сложности
алгоритмов (3)
Например, вектора специальных признаков для определения
принадлежности элементов множества тому или иному
подмножеству его разбиения (алгоритм Краскала [Ахо]) .
Каждая вершина может принадлежать только одной компоненте
связности, следовательно, этой вершине можно сопоставить номер
компоненты связности xi  ki, что предлагается использовать для
проверки образования цикла добавляемым ребром.
Проверка образования цикла с использованием массива номеров
компонент выполняется с вычислительной сложностью O(1), но
требует коррекции номеров компонент при добавлении ребер,
связывающих разные компоненты связности с вычислительной
сложностью O(n).
9
Способы снижения вычислительной сложности
алгоритмов (4)
Вычислительная сложность слияния n компонент, каждая из которых
содержала по одному элементу, равна O(n2). При использовании
данного способа она снижается до O(n  logn);
7) замена операции определения X2 как дополнения подмножества X1
до X операцией дополнения подмножества Xi (элемента xi) до
подмножества X2:
X2 = X \ X1 ~ X2 = X2 \ Xi или в частном случае X2 = X \ X1 ~ X2 = X2 \ xi,
если X = X 2  X1 и до выполнения операции X2 = X \ X1 множество X1
определялось как X1 = X1  Xi (X1 = X1  xi).
Вычислительная сложность снижается с XX1 до X2Xi. Так
как XX2 и X1  Xi, данное преобразование целесообразно
при любых условиях. Оно легко может быть сформулировано в виде
формального правила.
8) удаление элемента несортированного множества при представлении
его вектором посредством замещения этого элемента последним
или первым.
10
Способы снижения вычислительной
сложности алгоритмов (5)
9) Замена выражений алгебры подмножеств логически эквивалентными
и требующим меньшего количества операций для их реализации. В
этом способе целесообразно выделить две группы:
– заменяемые и заменяющие выражения состоят из одних и тех же
подмножеств;
– в заменяемые и заменяющие выражения могут входить и разные
подмножества, на отношения между которыми наложены
дополнительные условия.
К первой группе относиться, например:
– замена выражения вида A  B  C, где C  A (C  A) на конструкцию
вида A \ C  B, где  – операция строгого или не строгого включения;
– использование для определения состава некоторого подмножества
вместо выражения A \ {B  C} или A \ {B  C} выражения A \ B \ C, где
A, B, C  U, в частном случае B, C  A.
В качестве примера преобразований второй группы можно привести
замену выражений xi  X1 на xi  X2, Xi  X1 на Xi  X2 =  и Xi  X1 =
 на Xi  X2 , если X2 = X \ X1, |X1| > |X2|, xi  X или Xi  X.;
11
Способы снижения вычислительной сложности
алгоритмов (6)
Эффективность преобразования первой группы рассмотрим на
примере операции строгого включения. . Эквивалентность
выражения A  B  C, где C  A (C  A), выражению A \ C  B
очевидна. Количество сравнений элементов множеств A, B, и C
равно kop1 = A  (B + C). Для выражения A \ C  B количество
операций сравнения kop2 = A  C + (A  – C)  B. Т. е. kop1 –
kop2 = B  C.
12
Способы снижения вычислительной сложности
алгоритмов (7)
10) определение результата операции над характеристическими
множествами одноместных предикатов как характеристического
множества результата операции над ними.
Рассмотрим этот способ на примере операции объединения.
Пусть множества P и Q заданы предикатами P(X) и Q(X).
Необходимо определить множество R = P  Q. Проанализируем
два варианта определения множества R.
1. Находим множества P и Q как характеристические множества
предикатов в соответствии с выражениями:
P = {xi : P(xi) = «и» / xi  X} и Q = {xi : Q(xi) = «и» / xi  X}.
Затем выполняем операцию их объединения: R = P  Q.
Количество операций сравнения, необходимых для определения
множества R, равно
F1 = (k1 + k2) X  + P Q ,
где k1 и k2 – количество операций, необходимых для определения
истинности P(xi) и Q(xi) соответственно.
13
Способы снижения вычислительной сложности
алгоритмов (8)
2. Определяем характеристическое множество предиката R(X) = P(X) 
Q(X):
R = {xi : P(xi) = «и»  Q(xi) = «и» / xi  X}.
В этом случае количество операций сравнения, необходимых для
определения множества R, равно
F2 = (k1 + k2 +1) X .
Асимптотическая оценка реализации операции в первом случае равна
O(n2), а во втором – O(n), где n = X . Очевидно, что применение
данного преобразования целесообразно при P Q   X .
Аналогичные выкладки можно выполнить и для других операций над
множествами.
14
Способы снижения вычислительной сложности
алгоритмов (9)
11) использовании операции композиции над двуместными
предикатами. Заданы двуместные предикаты Г1(X, U) и Г2(U, Z).
Необходимо определить образы элементов x относительно
предиката F1(X, Z) = Г1(X, U)  Г2(U, Z), здесь  – символ
операции композиции,
где . F1(x, z) = «и»: u (Г1(x, u) = «и»  Г2(u, z) = «и»).
Пусть X = {x1, x2, x3}, U = {u1, u2, u3, u4}, Z = {z1, z2, z3} и предикаты
принимают значение «истина» на парах:
Г1(X, U): (x1, u1), (x1, u2), (x2, u3), (x3, u4);
Г2(U, Z): (u1, z2), (u1, z3), (u2, z2), (u2, z3), (u3, z3), (u4, z1), (u4, z2).
15
Способы снижения вычислительной сложности
алгоритмов (10)
Для перехода к моделям задач структурного синтез приравняем
множество Z к множеству X. Множества X и U определим как вершины
и рёбра графа соответственно. Тогда композиция предикатов Г1(X, U)
и Г2(U, X) – это предикат смежности F1(X, X) = Г1(X, U)  Г2(U, X) графа.
Количество операций сравнения, необходимых для определения образа
вершины xi относительно предиката смежности как объединение
подмножеств вершин, инцидентных ребрам uj  Г1xi
F1xi =  Г2uj,
uj Г1xi
будет иметь асимптотическую оценку O1(m 2 n2), если Г1xi  и Г2uj 
ограничены m и n соответственно.
При определении F1xi как характеристического множества предиката
F1xi(X) = {xk : Г1xi  xk   / xk  X} асимптотическая оценка - O2(m 2 n).
16
Способы снижения вычислительной сложности
алгоритмов (11)
12) использование свойств логических операций над
предикатами. Этот способ рассмотрим на примере
определения характеристического множества операции
конъюнкции. Пусть необходимо определить характеристические
множества предиката T(X) = P(X)  Q(X).
Характеристическое множество предиката T(X) определяется по
формуле:
T = {xi : P(xi) = «и»  Q(xi) = «и» / xi  X}.
Операция конъюнкции обладает свойством коммутативности.
Очевидно, что при определении T, если P(xi) = «л», то значение
Q(xi) нет необходимости проверять. Отсюда следует, что
использование свойства коммутативности приведёт к
сокращению количества операций сравнения, если при
определении T предикаты P(xi) и Q(xi) располагать по
возрастанию вероятности исхода «истина».
17
Способы снижения вычислительной сложности
алгоритмов (12)
При выполнении операций над более чем двумя предикатами, их
ранжирование правомерно на основании законов
ассоциативности и коммутативности. Использование данного
преобразования возможно, если существуют или могут быть
получены за приемлемое время оценки вероятности исхода
«истина» соответствующих предикатов.
18
Способы, базирующиеся на использовании
ограниченности количества компонентов, связанных с
добавляемым/удаляемым
В качестве примера рассмотрим алгоритм итерационного улучшения,
применяемый при разрезании гиперграфа H.
Выполнение операции попарного перемещения двух вершин xi и xj
приводит к тому, что в разрез попадают или из разреза уходят только
ребра, связанные с этими вершинами. Поэтому достаточно
определить количество ребер, пришедших в разрез и ушедших из
него, и рассчитать их приращение. Если не учитывать этот факт, то
количество ребер в разрезе должно определяться по формуле
Si1,2 = |Г(X1i)  Г1(X2i ) |
и вычислительная сложность составит O(n 2), если n  m.
Целесообразно использовать рекуррентную формулу:
Si1,2 = Si-11,2 + S+(xi) + S+(xj) – S-(xi) – S-(xj),
где S+(xi), S+(xj)– количество ребер, пришедших в разрез при
перемещении вершин xi, xj, а S-(xi), S-(xj) – количество ребер,
ушедших из разреза в том же случае. Вычислительная сложность
данного варианта определяется как O(n).
Пользователь может описать данные вычисления несколькими
способами, что существенно усложняет распознавание заменяемой
строки.
19
Способы, базирующиеся на использовании
ограниченности количества компонентов, связанных с
добавляемым/удаляемым
В моделях большинства реальных объектов количество вершин,
инцидентных ребру |Г(uj)| = A, и количество ребер, инцидентных
вершине |Г(xi)| = , как правило, существенно меньше количества
вершин и ребер графа соответственно, что позволяет:
1) исключить повторные вычисления при пошаговом формировании
графа-результата (способы 1–3), так как
•
при добавлении/удалении ребра uj меняются характеристики и
свойства только инцидентных ему вершин и смежных ребер:
|F2(uj)| = A,
•
при добавлении/удалении вершины меняются характеристики
и/или свойства только инцидентных ей ребер и смежных вершин:
|F1(xi)| = A;
2) исключить лишние вычисления при определении характеристик и
анализе свойств компонентов графовой модели (способ 4),
заранее определяя множество компонент, обладающих
20
исследуемыми характеристиками или свойствами.
Формализация оптимизирующих преобразований
алгоритмов (1)
Способ снижения вычислительной сложности, сформулированный
в терминах нотаций формального описания алгоритма,
называется оптимизирующим преобразованием. Для
обеспечения универсальности оптимизирующих
преобразований их, а также и средства оценки, целесообразно
разрабатывать не для программы, а для описания алгоритма на
языке в терминах операций над множествами и графами в виде
решающих правил.
Для формализации применения способов снижения
вычислительной сложности необходимо:
- получить описание алгоритма, позволяющее выполнять
оптимизирующие преобразования;
- исследовать приемы снижения вычислительной сложности и
сформулировать решающие правила для включения
оптимизирующих преобразований в трансляторы или
построения специального модуля – оптимизатора.
21
Формализация оптимизирующих преобразований
алгоритмов
Формализация оптимизирующих преобразований необходима для
автоматической трансформации алгоритма посредством замены
объекта и/или операций над ним. Поскольку эти преобразования
основаны на исследовании процесса трансформации модели
исходного описания объекта в модель результата, их целесообразно
выполнять при описании алгоритмов на уровне множеств и/или
графов.
Реализация того или иного способа снижения вычислительной
сложности в виде оптимизирующего преобразования требует
выполнения следующих этапов:
– выявление заменяемого и синтез заменяющего фрагментов;
– доказательство эквивалентности преобразования;
– формирование условий, при выполнении которых эта замена
возможна и приведет к снижению вычислительной сложности
алгоритма.
22
Виды оптимизирующих преобразований
Оптимизирующие преобразования разделяют на контекстносвободные и контекстно-зависимые. Преобразование является
контекстно-свободным, если не существует условий на
допустимые связи преобразуемого фрагмента с остальными
компонентами алгоритма, при выполнении которых вносимые в
него изменения корректны и целесообразны (эффективны).
Другими словами, преобразование будет контекстно-свободным,
если заменяющий фрагмент конструируется только из
объектов заменяемого фрагмента (логических переменных и
их значений, элементов множеств, самих множеств и графов), а
корректность и целесообразность замены может быть
доказана без привлечения информации, не содержащейся в
заменяемом фрагменте. В противном случае преобразование
будет контекстно-зависимым.
23
Формализация оптимизирующих преобразований
алгоритмов
Примером контекстно-свободного преобразования может служить
замена операции сравнения множеств, записанной в виде X1 
X2  xi, на операцию X1 \ xi  X2. Контекстно-зависимым
преобразованием является замена X2 = X \ X1 на X2 = X2 \ xi,
которая может быть выполнена, если перед определением X2
как X \ X1 в алгоритме осуществляется операция X1 = X1  xi.
Условие на требуемые свойства объектов алгоритма и/или связи
заменяемого фрагмента с остальной частью алгоритма, при
выполнении которого эта замена возможна, назовём условием
допустимости.
24
Структура оптимизирующих преобразований
Для выполнения оптимизирующих преобразований необходимо:
- определить в алгоритме фрагмент, аналогичный заменяемому
данного оптимизирующего преобразования;
- проверить выполнение условий допустимости;
- интерпретировать заменяющий фрагмент;
- оценить, если это необходимо, эффективность
трансформации алгоритма;
- заместить найдённый фрагмент полученным.
Проверку наличия в алгоритме фрагмента – аналога заменяемому
данного оптимизирующего преобразования, будем называть
«условием существования».
25
Структура оптимизирующих преобразований
Отношение или логическое выражение, устанавливающее факт
снижения вычислительной сложности алгоритма при замещении
заменяемого фрагмента заменяющим, назовём условием
целесообразности. Эффективность оптимизирующего
преобразования является функцией отношений и характеристик
конкретных объектов алгоритма, свойств и количества операций
над ними. Таким образом, условие целесообразности является
объектно и параметрически зависимым.
26
Структура оптимизирующих преобразований
Таким образом, формальное описание оптимизирующего
преобразования должно задавать синтаксис заменяемого и
заменяющего фрагментов и логические выражения указанных
выше условий. Это описание должно базироваться на
синтаксисе и семантике средств описания алгоритмов –
соглашениях о символике объектов и операций теории
множеств, математической логики и теории графов.
Синтаксические правила оптимизирующих преобразований
должны задавать структуру фрагмента, определяя тип его
объектов и порядок их связывания конкретными операциями.
27
Синтаксическое описание оптимизирующих
преобразований
Рассмотрим формализацию контекстно свободного
преобразования, выполняющего замену фрагмента Xj  X2  Xi
(Xj  X2  xi) на фрагмент Xj \ Xi  X2 (Xj  X2 \ xi) .
Эквивалентность фрагментов нетрудно доказать, если Xj, X2 и Xi
не пустые множества эффективность преобразования
параметрически независима.
Формальное описание данного преобразования представляет
собой множество синтаксических правил, задающих структуру
рассмотренных выше заменяемых фрагментов и
синтаксическое правило заменяющего.
28
Формализация оптимизирующих преобразований
Синтаксическое описание заменяемого Xj  X2  Xi (Xj  X2  xi) и
заменяющего Xj \ Xi  X2 (Xj  X2 \ xi) фрагментов имеют вид:
<Заменяемый фрагмент 1> ::= <Объект 1>  <Объект 2>  <Объект 3>,
<Объект 1> ::= <Множество 1>,
<Объект 2> ::= <Множество 2>,
<Объект 3> ::= <Множество 3>  <Элемент множества>.
<Заменяющий фрагмент> ::= <Объект 1> \ <Объект 3>  <Объект 2>.
29
Формализация оптимизирующих преобразований
Реализацию оптимизирующего преобразования формально
опишем в виде решающего правила трансформации. Это
правило должно включать условие существования,
проверять условия контекстной зависимости, из множества
лексем, полученных при разборе заменяемого фрагмента,
строить заменяющий фрагмент и выполнять подстановку.
Поскольку рассмотренное выше преобразование является
контекстно-свободным, его решающее правило будет иметь
вид:
(A) (  ),
где  = <Заменяемый фрагмент 1>,  = <Заменяющий
фрагмент>, A – множество строк описания алгоритма,  –
символ вывода – замещение найдённого фрагмента на
синтезированный заменяющий фрагмент.
30
Формализация оптимизирующих преобразований
В качестве второго примера рассмотрим, как строится решающее
правило для замены операции объединения множеств или
множества и элемента операцией конкатенации:
X = X1  X2 на X = X1  X2 или X = X1  xi на X = X1  xi.
Эта замена возможна, т. е. результаты вычислений будут
эквивалентны, только в том случае, если эти множества не
пересекаются или элемент не принадлежит множеству. Таким
образом, преобразование является контекстно зависимым.
Информация о выполнении условия корректности может
присутствовать в разделе описаний алгоритма или получена от
разработчика. Преобразование не требует дополнительной
памяти и целесообразно.
31
Формализация оптимизирующих преобразований
Синтаксически заменяемый и заменяющий фрагменты имеют вид:
<Заменяемый фрагмент> ::= <Фрагмент 1> | <Фрагмент 2>,
<Фрагмент 1> ::= <Множество 1>  <Множество 2>,
<Фрагмент 2> ::= <Множество 1>  <Элемент>,
<Заменяющий фрагмент> ::= <Фрагмент З1> | <Фрагмент З2>,
<Фрагмент З1> ::= <Множество 1>  <Множество 2>,
<Фрагмент З2> ::= <Множество 1>  <Элемент>.
Поскольку фрагмент 1 заменяется на фрагмент З1, а фрагмент 2 –
на фрагмент З2, правило трансформации будет включать две
части:
((A) & (<Множество 1>  <Множество 2> = )) (  ),
((A) & (<Элемент>  <Множество 1>)) (  ),
где  =<Фрагмент 1>,  = <Фрагмент 2> – заменяемые строки;
 = <Фрагмент З1>,  = <Фрагмент З2> – заменяющие строки;
A – множество строк описания алгоритма.
32
Download