- •НИУ ВШЭ – Пермь
- •Понятие сложности алгоритма
- •Понятие сложности алгоритма:
- •Понятие сложности алгоритма:
- •Понятие сложности алгоритма:
- •Понятие сложности алгоритма:
- •Понятие сложности алгоритма:
- •Понятие сложности алгоритма:
- •Понятие сложности алгоритма:
- •Понятие сложности алгоритма:
- •Оценка сложности алгоритма с использованием управляющего графа
- •Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
- •Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
- •Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
- •Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
- •Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
- •Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
- •Оценка входных данных
- •Оценка входных данных
- •Пример оценки сложности алгоритма с ветвлениями
- •Пример оценки сложности алгоритма с ветвлениями
- •Пример оценки сложности алгоритма с ветвлениями
- •Оценка алгоритмов, содержащих циклы с предусловием и постусловием
- •Оценка алгоритмов, содержащих циклы со счётчиком
- •Оценка алгоритмов, содержащих циклы со счётчиком
- •Оценка алгоритмов, содержащих циклы со счётчиком
- •Оценка алгоритмов, содержащих циклы со счётчиком
- •Оценка алгоритмов, содержащих циклы со счётчиком
- •Оценка рекурсивных алгоритмов (простая рекурсия)
- •Оценка рекурсивных алгоритмов (простая рекурсия)
- •Оценка рекурсивных алгоритмов (простая рекурсия)
- •Оценка рекурсивных алгоритмов (простая рекурсия)
- •Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала
- •Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала
- •Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала
- •Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала
- •Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала
- •Пример – оценка сложности итерационной функции вычисления факториала
- •Понятие задачи и классы сложности задач
- •Понятие задачи и классы сложности задач
- •Понятие задачи и классы сложности задач
Оценка сложности алгоритма с использованием управляющего графа
|
Управляющий граф строится следующим образом: |
|
•Имеется стартовая вершина (вход в алгоритм). |
|
•Каждому оператору, включённому в алгоритм (оператору присваивания, |
|
вызову процедуры и пр.), ставится в соответствие вершина графа (точка), |
|
имеющая метку (вес, равный сложности этого оператора). |
|
•Два последовательно записанных оператора (последовательно |
|
исполняемых) изображаются вершинами, соединёнными стрелкой, |
|
указывающей порядок их исполнения. |
|
•Условный оператор задаёт разветвление в управляющем графе: |
|
начинается с вершины, соответствующей вычислению условия, с двумя |
|
выходящими дугами с приписанными им вариантами then, else (т.е. True и |
|
False), которые указывают вершины, представляющие операторы, |
|
исполняющиеся при выполнении и невыполнении условия; заканчивается |
|
пустой вершиной (без операций). |
11 |
•Циклы реализуются через ветвления. |
•Имеется вершина, отмечающая завершение алгоритма (конечная, |
|
|
финишная). |
Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
Пусть программа содержит ветвления, где выбор ветвей определяется условиями C1, C2, C3, …, Cn:
if C1 then
if C2 then … else …
else if C3 then else …
12
Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
Пусть управляющий граф программы содержит ветвления, где выбор ветвей определяется условиями C1, C2, C3, …, Cn:
C3
C1 = false
|
C1 |
C1 = true |
C2 |
|
13
Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
Пусть управляющий граф программы содержит ветвления, где выбор ветвей определяется условиями C1, C2, C3, …, Cn:
C3
C1
Проверка условия C1
выполняется всегда, таким образом, оно разбивает все C2
ветви на две группы: для первой условие истинно, для второй – ложно
Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
Пусть управляющий граф программы содержит ветвления, где выбор ветвей определяется условиями C1, C2, C3, …, Cn:
C3
C1
|
Условие C2 разбивает группу |
C2 |
ветвей, для которых условие C1 |
истинно, ещё на две группы, для |
|
|
которых истинны условия |
15 |
(C1 and C2) и (C1 and not C2) |
соответственно |
Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
Пусть управляющий граф программы содержит ветвления, где выбор ветвей определяется условиями C1, C2, C3, …, Cn:
|
Условие C3 также разбивает группу |
C3 |
ветвей, для которых условие C1 |
ложно, ещё на две группы, |
|
|
удовлетворяющих условиям |
C1 |
(not C1 and C3) и (not C1 and not C3) |
соответственно |
C2
16
Оценка алгоритмов, содержащих ветвления, на основе оценки входных данных
Пусть управляющий граф программы содержит ветвления, где выбор ветвей определяется условиями C1, C2, C3, …, Cn:
C3
C1
|
C2 |
Для следующих ветвлений |
|
|
|
|
|
(до Cn) этот процесс |
17 |
|
«разбиения» ветвей на группы |
|
можно было бы продолжить |
|
|
|
Оценка входных данных
Выбор ветвей определяется комбинацией входных данных D. Множество комбинаций исходных данных D также можно разбить на две части D1 и D2 (два подмножества), порождаемые условием C1. В свою очередь D1 делится на D3 и D5, а D2 разбивается на D5 и D6 (по соответствующим условиям).
D2
D5
D
D6
D3
D4
18 |
D1 |
|
Оценка входных данных
Каждая область (подмножество D), которая не разбивается больше ни на какие другие более мелкие части, соответствует ветви в управляющем графе (ветви пересекаются в начальной части графа – для общих условий, определяющих их выбор).
Все такие подмножества комбинаций входных данных (областей на рисунке) обозначены di. В том случае, когда все комбинации исходных данных являются равновероятными, частоту исполнения i й ветви можно оценить как отношение мощности подмножества di к мощности всего множества D: pi = | di | / | D |.
Если имеются оценки li веса (сложности) i й ветви, то сложность такого алгоритма с ветвлениями можно оценить величиной
19 где k – количество всех ветвей.
Пример оценки сложности алгоритма с ветвлениями
Пусть алгоритм с ветвлением имеет вид
C1 |
|
0.5) * 2 |
|
|
|
else |
if X < 0.75 |
X * 2 + 0.5 + X**2 + X**3 |
Y := X
C3
Допустим, что значение переменной X может принадлежать диапазону
[0.00, 1.00], причём ввод любого значения из указанного диапазона равновероятен. Тогда вероятность того, что значение X [0.00, 0.50), примерно равна вероятности того, что X [0.50, 1.00].
В приведённом примере вероятность выбора ветви Y := (X + 0.5) * 2 равна 0.5. При невыполнении условия X < 0.5 выбор ветви определяется
20 проверкой условия X < 0.75.
