
- •Понятие алгоритма и свойства алгоритмов.
- •Формализация понятия алгоритма: машина Тьюринга. Представление машин Тьюринга с помощью диаграмм. Табличное представление программ машины Тьюринга. Композиция машин Тьюринга. Примеры.
- •Двумерная таблица
- •С помощью диаграммы
- •Формализация понятия алгоритма: нормальные алгорифмы Маркова, определение и выполнение. Примеры.
- •Вычислимые функции. Базовый набор функций и операции над функциями: суперпозиция, примитивная рекурсия, минимизация. Классы вычислимых функций. Примеры.
- •Проблема алгоритмической разрешимости. Примеры неразрешимых алгоритмических проблем.
- •Методы разработки алгоритмов. Суперпозиция, итерация, рекурсия и др.
- •Технология разработки программ. Технология и методы тестирования программ.
- •Составление алгоритма.
- •Создание документации, помощи.
- •Рекурсивные алгоритмы: определение и виды рекурсии. Реализация рекурсии и использование стека. Рекурсия и итерация. Примеры, сравнение.
- •Задача анализа сложности алгоритмов. Временная и емкостная сложности. Оценки сложности. Использование управляющего графа для оценки сложности линейных и ветвящихся алгоритмов.
- •Оценка сложности циклических алгоритмов. Примеры.
- •Количество повторений вложенного цикла не зависит от параметра внешнего цикла
- •Количество повторений вложенного цикла зависит от параметра внешнего цикла
- •Оценка сложности рекурсивных алгоритмов: рекурсия с одним и многими рекурсивными вызовами, случай косвенной рекурсии.
- •If … then процедура_1
- •Оптимизация алгоритмов. Примеры.
- •Понятие сложности задачи и классы сложности задач. Понятие сводимости, полиномиальная сводимость.
- •Методы сортировок: сортировка массивов простыми включениями, сортировка массивов простым выбором, сортировка обменами. Анализ сложности алгоритмов сортировки.
- •Сортировка методом простого выбора
- •Сортировка методом простых вставок (метод прямого (простого) включения)
- •2 Пересылки записей
- •1 Пересылка записи
- •Методы сортировок: алгоритм быстрой сортировки. Анализ сложности алгоритма быстрой сортировки.
- •Обзор методов сортировок: сортировка Шелла, пирамидальная сортировка, сортировка слияниями, Шейкер-сортировка, сортировка подсчетом, цифровая сортировка и др.
- •Методы поиска: линейный поиск, метод бинарного поиска, поиск с помощью бинарного дерева, метод случайного поиска и др.
- •Алгоритмы внешней сортировки: метод естественного слияния, метод сбалансированного слияния. Двухпутевая и многопутевая реализации. Фибоначчиева сортировка.
- •Метод квадратичного рехеширования.
- •Рекурсивные типы данных: определение, примеры.
- •Id:integer; {номер вершины}
- •Операции над линейными списками: создание списков, включение элементов в списки (рассмотреть различные способы). Виды связных списков.
- •Операции над линейными списками: удаление элементов списков. Поиск элементов списков, сравнение списков.
- •Операции над бинарными деревьями: включение вершины в дерево. Обход деревьев, подсчет числа вершин в дереве. Подсчет числа вершин, удовлетворяющих заданному условию.
- •Операции над бинарными деревьями: удаление вершины дерева.
- •Понятие сбалансированности бинарного дерева. Приведение дерева к авл-сбалансированному виду: виды и формулы поворотов.
- •Анализ сложности алгоритмов работы с бинарными деревьями.
- •Деревья со многими потомками. Специальные виды деревьев: деревья формул, б-деревья, 2-3 деревья, красно-черные деревья.
- •Понятие графа. Способы представления графов. Операции над графами: добавление вершины, добавление дуги, создание графа.
- •Операции над графами: поиск вершины, удаление вершины, удаление дуги, текстовый вывод графа.
- •Алгоритмы поиска на графах: поиск в глубину и в ширину.
- •Примеры алгоритмов на графах (поиск кратчайшего пути, поиск циклов, алгоритм построения остовного дерева, выделения связных компонентов…).
- •Формальные языки и грамматики. Определение языка, описание языка. Понятие грамматики.
- •Классификация формальных языков. Понятие вывода.
- •Описание синтаксиса языка с помощью синтаксических диаграмм и бнф. Примеры.
- •Основы теории информации. Понятие энтропии. Измерение информации: вероятностный и алфавитный подходы.
- •Основы теории кодирования информации. Метод Шеннона-Фано. Код Хаффмана.
- •1. Принцип программного управления.
- •2. Принцип однородности памяти.
- •3. Принцип адресности.
- •Конвейеризация вычислений.
- •Иерархия запоминающих устройств эвм
- •Устройство процессора. Понятие архитектуры cisc, risc, vliw.
- •Работа процессора
- •Cisc-процессоры
- •Risc-процессоры
- •Misc-процессоры
- •Vliw-процессоры
- •Типы данных, поддерживаемые процессорами Intel, форматы данных.
- •Система команд Intel, классификация команд, форматы команд.
- •Объектно-ориентированное программирование (ооп): основные понятия.
Задача анализа сложности алгоритмов. Временная и емкостная сложности. Оценки сложности. Использование управляющего графа для оценки сложности линейных и ветвящихся алгоритмов.
Сложность алгоритма определяется в двух аспектах: сложность по памяти и сложность по времени исполнения. Емкостная сложность алгоритма определяет, насколько много памяти требуется для выполнения этого алгоритма. Временная сложность алгоритма определяет, насколько много процессорного времени требует алгоритм для своего выполнения.
Оценка временной сложности. Рассчитывается в относительных единицах так, чтобы эта оценка, по возможности, была одинаковой для компьютеров с разной тактовой частотой, а именно в количестве исполняемых операций. Рассмотрим подробно список операций, учитываемых при подсчете временной сложности (каждая из перечисленных операций принимается с весом равным 1)
арифметические операции (+,–,*,/,div, mod);
унарный минус (–);
операция пересылки, возникающая при выполнении оператора присваивания (:=);
операции сравнения (>,<,=,<=,>=,<>);
логические и побитовые операции (not, and, or, xor, shr, shl);
выполнение стандартных функций (inc(), dec(), abs(), sin(), cos(), exp(), ln(), arctan(), sqr(), sqrt(), int(), frac(), round(), trunc(), odd(), chr(), ord(), pred(), succ(), upcase(), high(), low());
операции ввода-вывода одной переменной (read(), readln(), write(), writeln()).
Оценка емкостной сложности. Учет памяти обычно ведётся по объёму данных и не принимается во внимание память, расходуемая для записи команд программы. Обозначим емкостную сложность алгоритма через S. Емкостную сложность будем подсчитывать в относительных единицах, не зависящих от языка программирования и компьютера на котором происходит выполнение программы, а именно в количестве скалярных переменных, описанных в программе. Под скалярными переменными будем понимать переменные и константы простых (скалярных) типов данных. Напомним, что к простым (скалярным) типам данных в Паскале относятся:
все числовые типы (целые – Integer, Byte, Word, ShortInt, LongInt;
вещественные – Real, Single, Double, Extended);
символьный тип (Char);
логический тип (Boolean);
перечислимый тип;
интервальный тип.
массив
емкостная сложность определяется числом элементов массива
строковый тип
емкостная сложность на единицу больше числа символов максимально допустимых в строке
запись
емкостная сложность равна сумме емкостных сложностей полей записи
Для многих задач возможно найти только верхнюю (Tmax) или нижнюю (Tmin) оценку сложности алгоритма, а также среднюю (Taverage) оценку. Для нахождения верхней оценки оценивается количество необходимых операций в худшем случае, то есть для набора исходных данных, требующих максимального количества операций обработки. Для нахождения нижней оценки ищется сложность для набора данных, требующего минимального количества операций.
Отыскание функции сложности производится на основе анализа текста алгоритма. С целью анализа алгоритм удобно представлять управляющим графом. В нём каждому оператору или вызову процедуры ставится в соответствие вершина графа (точка).
Каждой вершине графа припишем число – количество операций, которые необходимо выполнить для исполнения оператора программы, связанного с этой вершиной. Это число назовём весом вершины. Вес пустой, начальной и заключительных вершин равен 0.
Управляющий граф представляет собой линейный участок. Сложность равна сумме весов вершин, принадлежащих линейному участку. Если на участке нет вершин – вызовов процедур, то сложность является константой.
Пример:
Рассмотрим фрагмент алгоритма:
a:=y+r;
Proc(a,y);
b:=4*d – 10 mod b;
Известно, что сложность процедуры Proc равна 2V+1.
Построим управляющий граф, снизу от каждой вершины графа напишем ее вес.
T(V)=2V+7.
Управляющий граф содержит разветвления, но не содержит циклов. Расчёт сложности зависит от того, рассматриваем мы худший, лучший или средний случай.
Поскольку для вычисления средней оценки сложности используется вероятностный подход, приведем начальные понятия из теории вероятности:
Вероятность события (p) есть объективная мера возможности события, выражаемая числом, удовлетворяющим условию 0 ≤ p ≤ 1.
Достоверное событие, т.е. то событие, которое непременно произойдет, имеет вероятность равную 1.
Невозможное событие имеет вероятность равную 0.
Пример:
Рассмотрим фрагмент алгоритма:
If a<b then x:=a else x:=b-2;
Известно, что вероятность выполнения
условия a<b
равна
.
Построим управляющий граф, внутри каждой вершины графа напишем ее вес.
Вычислим веса ветвей T1 = 1+1+0 = 2, T2 = 1+2+0 = 3. Tmin = 2, Tmax = 3. Для определения средней оценки сложности вычислим вероятности выполнения ветвей.
p1 = по условию,
p2 = 1 – p1
=
,
т.к. события «выполнилась 1 ветвь» и
«выполнилась 2 ветвь» несовместны и
образуют полную группу.
Taverage = p1T1+p2T2 = ·2+ ·3 = 2 = 2,25.