1. Практическое занятие 3
Оценка трудоемкости алгоритмов
1.
2.
3.
4.
Теоретические сведения
Контрольные вопросы
Указания по выполнению заданий
Задания
2. Теоретические сведения
При оценке трудоемкости алгоритмов, представленных
операторными
схемами,
каждому
оператору
сопоставляется трудоемкость (время) его исполнения.
Задаются также правила, частоты или вероятности
перехода от одного оператора к другому. При этом
соответствующая частота (или вероятность) перехода
отлична от нуля только в том случае, когда этот переход
возможен. Требуется определить время исполнения всего
алгоритма или математическое ожидание этого времени.
При этом множество переменных и отношения «быть
аргументом» и «иметь результатом» операторной схемы не
принимаются во внимание.
Одна из простейших схем оценки трудоемкости алгоритма
получается, если рассматривать операторную схему, как
цепь Маркова, приписывая каждой паре операторов (Sj, Sk)
вероятность перехода pjk (pjk = 0 если Sj и Sk не являются
предшественником и преемником соответственно).
3. Теоретические сведения
Вероятности pjk должны удовлетворять условию
m
∑ p jk
k =1
= 1, j = 1,..., m.
Если в схеме есть хотя бы один выход Sout, то вводят
дополнительный (поглощающий) оператор останова Sm + 1:
pm + 1, k = 0 для k = 1, …, m, pm + 1, m + 1 = 1.
Для любого выхода Sout операторной схемы следует принять
pout, m + 1 = 1, для остальных операторов pj, m + 1 = 0.
Для оценки средних значений времени от начала исполнения
любого оператора до завершения работы программы
можно воспользоваться уравнением
W = (E – Q)–1t,
где W – вектор средних значений времени от исполнения
операторов до завершения программы, t – вектор значений
времени исполнения каждого оператора, E – единичная
4. Теоретические сведения
Пример 1. Определить трудоемкость алгоритма отыскания
минимума m функции f для целых значений аргумента от 1
до n.
1. Выполнить начальные присваивания: m = f(1), i = 2.
(S1)
2. Если i > n, то перейти к шагу 7.
(S2)
3. Выполнить присваивание u = f(i).
(S3)
4. Если u ≥ m, то перейти к шагу 6.
(S4)
5. Выполнить присваивание m = u.
(S5)
6. Выполнить присваивание i = i + 1 и перейти к шагу 2. (S6)
7. Вывести на экран m.
(S7)
5. Теоретические сведения
Оператор S2 исполняется первый раз при i = 2, затем – при i =
3, 4, … . Последний раз он исполняется при i = n + 1, и
после перехода на оператор S7 работа алгоритма
завершается. Таким образом, оператор S2 исполнится
ровно n раз, операторы S1 и S7 – по одному разу, а
операторы S3, S4 и S6 – по n – 1 разу. Число исполнений
оператора S5 однозначно определить нельзя, если ничего
не знать о свойствах последовательности значений f(1),
f(2), …, f(n). Предположим, что эти значения случайны и
независимы. Заметим, что в операторе S5 значение u равно
f(i), а m – это наименьшее значение среди f(1), f(2), …, f(i –
1). Неравенство u < m означает, что среди чисел f(1), f(2),
…,
f(i)
наименьшим является
f(i). При нашем
предположении
вероятность
этого
равна
1/i.
Следовательно,
математическое
ожидание
числа
исполнений оператора S5 равно 1/2 + 1/3 + ..+ 1/n . Если tj –
время исполнения оператора Sj, то средняя трудоемкость
n 1
всего алгоритма + t + nt + (n − 1)(t + t + t ) + t
t равна
1
7
2
3
4
6
5
∑i
i=2
6. Теоретические сведения
Еще один метод оценки трудоемкости алгоритма основан на
решении уравнений Кирхгофа, составляемых по графу
переходов. Здесь общее время работы алгоритма
определяется по формуле
t0 =
m
∑n jt j
j =1
где tj – время исполнения оператора Sj, nj – число исполнений
оператора Sj. Решение уравнений Кирхгофа позволяет
найти nj, j = 1, …, m.
Для составления уравнений требуется, чтобы в схеме были
указаны один начальный оператор, с которого начинается
исполнение алгоритма, и один заключительный оператор,
на котором оно заканчивается.
7. Теоретические сведения
Добавим к графу переходов еще одну дугу a0, исходящую из
заключительного оператора и заходящую в начальный, и
припишем ей число переходов, равное 1. Дуги исходного
графа обозначим a1, a2, …, as, а число переходов по дуге
ai – gi. Тогда для каждого оператора Sj число nj его
исполнений за время работы программы может быть
подсчитано суммированием либо чисел переходов на
оператор Sj, либо чисел переходов от Sj:
∑ gi = ∑ gi = n j
ai → S j
ai ← S j
при j = 1, …, m (закон Кирхгофа), где ai → Sj означает, что дуга
ai заходит в вершину Sj, а ai ← Sj – что дуга ai исходит из
вершины Sj.
8. Контрольные вопросы
1.
2.
3.
4.
5.
Трудоемкость алгоритма.
Операторная схема как цепь Маркова.
Условия вероятностей переходов.
Поглощающий оператор.
Формула оценки средних значений от исполнения
операторов до завершения работы программы.
6. Уравнение для определения числа переходов.
7. Составление графа переходов.
8. Составление системы уравнений Кирхгофа по графу
переходов.
9. Число уравнений Кирхгофа.
10.Число зависимых и независимых переменных в системе
уравнений Кирхгофа.
9. Указания по выполнению заданий
1. Получить задание
2. Разработать алгоритм решения задачи.
3. Определить формулу для расчета трудоемкости
алгоритма.
4. Построить граф переходов.
5. Составить систему уравнений Кирхгофа.
6. Решить систему уравнений Кирхгофа.
7. Подготовить отчет по выполнению задания. Отчет
должен включать задание и описание этапов
выполнения задания.
8. Ответить на вопросы по выполнению задания и
контрольные вопросы
10. Задания
1. Определить длину наибольшей невозрастающей подпоследовательности
последовательности чисел, заканчивающейся 0.
2. Определить длину наименьшей невозрастающей подпоследовательности
последовательности из 25 чисел.
3. Определить длину наибольшей неубывающей подпоследовательности
последовательности из 25 чисел.
4. Отсортировать по убыванию массив из 10 положительных чисел методом
последовательного нахождения максимума.
5. Отсортировать по возрастанию массив из 10 целых чисел, не
превосходящих по абсолютному значению 100, методом
последовательного нахождения минимума.
6. Отсортировать массив из 10 чисел методом пузырька.
7. Определить наибольшую десятичную цифру целого числа.
8. Определить число десятичных цифр целого числа.
9. Переставить элементы массива из 20 чисел в обратном порядке.
10. Найти количество различных чисел среди элементов целочисленного
массива из 25 элементов.
11. Выполнить умножение многочленов, степень, которых не выше 10, а
целочисленные коэффициенты записаны в двух массивах.
12. Выполнить двоичный поиск в массиве из 30 чисел заданного числа.
13. Найти наибольший общий делитель двух натуральных чисел, используя
алгоритм Евклида.