
- •Понятие алгоритма и свойства алгоритмов.
- •Формализация понятия алгоритма: машина Тьюринга. Представление машин Тьюринга с помощью диаграмм. Табличное представление программ машины Тьюринга. Композиция машин Тьюринга. Примеры.
- •Двумерная таблица
- •С помощью диаграммы
- •Формализация понятия алгоритма: нормальные алгорифмы Маркова, определение и выполнение. Примеры.
- •Вычислимые функции. Базовый набор функций и операции над функциями: суперпозиция, примитивная рекурсия, минимизация. Классы вычислимых функций. Примеры.
- •Проблема алгоритмической разрешимости. Примеры неразрешимых алгоритмических проблем.
- •Методы разработки алгоритмов. Суперпозиция, итерация, рекурсия и др.
- •Технология разработки программ. Технология и методы тестирования программ.
- •Составление алгоритма.
- •Создание документации, помощи.
- •Рекурсивные алгоритмы: определение и виды рекурсии. Реализация рекурсии и использование стека. Рекурсия и итерация. Примеры, сравнение.
- •Задача анализа сложности алгоритмов. Временная и емкостная сложности. Оценки сложности. Использование управляющего графа для оценки сложности линейных и ветвящихся алгоритмов.
- •Оценка сложности циклических алгоритмов. Примеры.
- •Количество повторений вложенного цикла не зависит от параметра внешнего цикла
- •Количество повторений вложенного цикла зависит от параметра внешнего цикла
- •Оценка сложности рекурсивных алгоритмов: рекурсия с одним и многими рекурсивными вызовами, случай косвенной рекурсии.
- •If … then процедура_1
- •Оптимизация алгоритмов. Примеры.
- •Понятие сложности задачи и классы сложности задач. Понятие сводимости, полиномиальная сводимость.
- •Методы сортировок: сортировка массивов простыми включениями, сортировка массивов простым выбором, сортировка обменами. Анализ сложности алгоритмов сортировки.
- •Сортировка методом простого выбора
- •Сортировка методом простых вставок (метод прямого (простого) включения)
- •2 Пересылки записей
- •1 Пересылка записи
- •Методы сортировок: алгоритм быстрой сортировки. Анализ сложности алгоритма быстрой сортировки.
- •Обзор методов сортировок: сортировка Шелла, пирамидальная сортировка, сортировка слияниями, Шейкер-сортировка, сортировка подсчетом, цифровая сортировка и др.
- •Методы поиска: линейный поиск, метод бинарного поиска, поиск с помощью бинарного дерева, метод случайного поиска и др.
- •Алгоритмы внешней сортировки: метод естественного слияния, метод сбалансированного слияния. Двухпутевая и многопутевая реализации. Фибоначчиева сортировка.
- •Метод квадратичного рехеширования.
- •Рекурсивные типы данных: определение, примеры.
- •Id:integer; {номер вершины}
- •Операции над линейными списками: создание списков, включение элементов в списки (рассмотреть различные способы). Виды связных списков.
- •Операции над линейными списками: удаление элементов списков. Поиск элементов списков, сравнение списков.
- •Операции над бинарными деревьями: включение вершины в дерево. Обход деревьев, подсчет числа вершин в дереве. Подсчет числа вершин, удовлетворяющих заданному условию.
- •Операции над бинарными деревьями: удаление вершины дерева.
- •Понятие сбалансированности бинарного дерева. Приведение дерева к авл-сбалансированному виду: виды и формулы поворотов.
- •Анализ сложности алгоритмов работы с бинарными деревьями.
- •Деревья со многими потомками. Специальные виды деревьев: деревья формул, б-деревья, 2-3 деревья, красно-черные деревья.
- •Понятие графа. Способы представления графов. Операции над графами: добавление вершины, добавление дуги, создание графа.
- •Операции над графами: поиск вершины, удаление вершины, удаление дуги, текстовый вывод графа.
- •Алгоритмы поиска на графах: поиск в глубину и в ширину.
- •Примеры алгоритмов на графах (поиск кратчайшего пути, поиск циклов, алгоритм построения остовного дерева, выделения связных компонентов…).
- •Формальные языки и грамматики. Определение языка, описание языка. Понятие грамматики.
- •Классификация формальных языков. Понятие вывода.
- •Описание синтаксиса языка с помощью синтаксических диаграмм и бнф. Примеры.
- •Основы теории информации. Понятие энтропии. Измерение информации: вероятностный и алфавитный подходы.
- •Основы теории кодирования информации. Метод Шеннона-Фано. Код Хаффмана.
- •1. Принцип программного управления.
- •2. Принцип однородности памяти.
- •3. Принцип адресности.
- •Конвейеризация вычислений.
- •Иерархия запоминающих устройств эвм
- •Устройство процессора. Понятие архитектуры cisc, risc, vliw.
- •Работа процессора
- •Cisc-процессоры
- •Risc-процессоры
- •Misc-процессоры
- •Vliw-процессоры
- •Типы данных, поддерживаемые процессорами Intel, форматы данных.
- •Система команд Intel, классификация команд, форматы команд.
- •Объектно-ориентированное программирование (ооп): основные понятия.
Методы сортировок: сортировка массивов простыми включениями, сортировка массивов простым выбором, сортировка обменами. Анализ сложности алгоритмов сортировки.
Сортировка – процесс перегруппировки заданного множества объектов в некотором определенном порядке. Цель сортировки – облегчить последующий поиск элементов в таком упорядоченном (отсортированном) множестве. Сортировку массивов называют внутренней сортировкой, т.к. массивы хранятся в быстрой, оперативной, внутренней памяти ЭВМ, допускающей случайный (прямой) доступ к элементам.
При анализе сложности алгоритмов сортировки будем учитывать только операции сравнения и пересылки записей.
Сортировка обменами:
Производится последовательное упорядочение смежных пар элементов массива: x[1] и x[2], x[2] и x[3], …x[N-1] и x[N]. Если первый элемент больше второго, то элементы переставляются. В итоге, после N–1 сравнения максимальное значение переместится на место элемента X[N], т.е. "вверху" оказывается самый "легкий" элемент – отсюда аналогия с пузырьком. Следующий проход делается до второго сверху элемента (X[N–1]) , таким образом второй по величине элемент поднимается на правильную позицию и т.д. Таким образом, нужно выполнить данную процедуру N–1 раз.
При первом прохождении нужно сравнить N–1 пар элементов, при втором – N–2 пары, при k-м прохождении – N‑k пар.
Program Sort1;
Const N=10;
Type mas=array[1..N] of real;
Var x:mas;
i,k:integer;
a:real;
Begin
For i:=1 to N do {Ввод элементов массива}
read(x[i]);
For i:=1 to N-1 do {Сортировка}
For j:=1 to N-i do
If x[j]>x[j+1] then Begin
a:=x[j];
x[j]:=x[j+1];
x[j+1]:=a;
End;
For i:=1 to N do {Вывод элементов массива}
Write(x[i],’ ‘)
End.
Среднее число сравнений и обменов имеют квадратичный порядок роста: О(n2), отсюда можно заключить, что алгоритм пузырька очень медленен и малоэффективен.
Сортировка методом простого выбора
Обычно применяется для массивов, не содержащих повторяющихся элементов.
Алгоритм:
1) выбрать максимальный элемент массива;
2) поменять его местами с последним элементом (после этого самый большой элемент будет стоять на своём месте);
3) повторить пункты 1-2 с оставшимися n–1 элементами.
Программа сортировки методом простого выбора:
Const N=10
Var a:array[1..N] of integer;
i,j,k,n,m:integer;
begin
for i:=1 to N do {Ввод элементов массива}
read(a[i]);
for i:=n downto 2 do begin
k:=i; {Запоминаем номер и }
m:=a[i]; {значение текущего элемента}
for j:=1 to i-1 do {Поиск максимального элемента}
if a[j]>m then begin
k:=j;
m:=a[k]
end;
if k<>i then begin {Меняем местами с последним}
a[k]:=a[i];
a[i]:=m
end
end;
for i:=1 to N do {Вывод элементов массива}
write(a[i]:3)
end.
Сортировка методом простых вставок (метод прямого (простого) включения)
Начиная со 2-го элемента, каждый текущий элемент с номером k запоминается в промежуточной переменной.
Затем просматриваются предыдущие k–1 элемент и ищется место вставки k-го элемента таким образом, чтобы не нарушить упорядоченности, при этом все элементы, превышающие k-й, сдвигаются вправо.
На освободившееся место вставляется k-й элемент.
const NMAX=10;
type item=record
key: integer; {ключ, по которому сортируется массив}
{сопутствующие элементы структуры записей}
end;
TMassiv= array [0..NMAX] of item;
Proсedure Sort_Insert(n:word; Var a:TMassiv);
Var i,j:word;
x:item;
BEGIN
For i:=2 To n Do bеgin
x:=a[i]; {передвигаемый в левую часть элемент}
a[0]:=x; {фиктивный элемент – «барьер»,
установлен на тот случай, когда a[i]
должен переместиться на первое место}
j:=i-1; {правый край левой части}
While x.kеy<a[j].key Do bеgin
a[j+1]:=a[j]; j:=j-1; {продвижение «дырки» в
левой части массива справа налево до той
позиции, в которую должен быть включен
элемент a[i]}
end;
a[j+1]:=x {включение a[i] в «дырку» в левой
части}
еnd
END;
Сложность:
Количество элементарных операций зависит, в первую очередь, от размера сортируемого массива. Однако величина n не определяет это количество однозначно. Для различных массивов одного и того же размера тело цикла While x.key<a[j].key Do будет выполняться различное число раз. Поэтому необходимы три оценки сложности: минимальная, максимальная и средняя.
Минимальная сложность получается в том случае, когда элементы упорядочиваемого массива уже располагаются в нужном порядке. Тогда проверки x.key<a[j].key всегда будут давать отрицательный результат и тело цикла не выполнится ни разу. И выполнение процедуры сведется к выполнению следующих операторов:
For i:=2 To n Do bеgin
x:=a[i];
a[0]:=x;
j:=i-1;
а[j+1]:=x
еnd
Тело цикла For исполняется точно n-1 раз, и число пересылок записей (присваиваний): Mmin=3(n-1).
Число сравнений ключей: Cmin=n-1.
Максимальная сложность получается в том случае, когда элементы исходного массива расположены в порядке убывания. Тело цикла While выполняется до тех пор, пока элемент х не натолкнется на барьер, т.е. при i=2 один раз, при i=3 два раза; при i=n выполнится (n-1) раз.
Количество пересылок
записей: Mmax=3(n-1)+
=
=3(n-1)+(1+2+...+n-1)=3(n-1)+n(n-1)/2=(6n-6+n2-n)/2=
=(n2+5n-6)/2.
Количество сравнений: Cmах=2+3+…+n=(n+2)(n-1)/2=
=(n2-n+2n-2)/2=(n2+n-2)/2.
Средняя оценка сложности получится, если предположить, что все элементы исходного массива – случайные числа. Результат очередной проверки в операторе While также является случайным, т.е. не можем сказать, сколько раз выполнится тело цикла.
Структуру процедуры с точки зрения анализа сложности можно переписать так:
For i:=2 To n Do
begin