
- •Понятие алгоритма и свойства алгоритмов.
- •Формализация понятия алгоритма: машина Тьюринга. Представление машин Тьюринга с помощью диаграмм. Табличное представление программ машины Тьюринга. Композиция машин Тьюринга. Примеры.
- •Двумерная таблица
- •С помощью диаграммы
- •Формализация понятия алгоритма: нормальные алгорифмы Маркова, определение и выполнение. Примеры.
- •Вычислимые функции. Базовый набор функций и операции над функциями: суперпозиция, примитивная рекурсия, минимизация. Классы вычислимых функций. Примеры.
- •Проблема алгоритмической разрешимости. Примеры неразрешимых алгоритмических проблем.
- •Методы разработки алгоритмов. Суперпозиция, итерация, рекурсия и др.
- •Технология разработки программ. Технология и методы тестирования программ.
- •Составление алгоритма.
- •Создание документации, помощи.
- •Рекурсивные алгоритмы: определение и виды рекурсии. Реализация рекурсии и использование стека. Рекурсия и итерация. Примеры, сравнение.
- •Задача анализа сложности алгоритмов. Временная и емкостная сложности. Оценки сложности. Использование управляющего графа для оценки сложности линейных и ветвящихся алгоритмов.
- •Оценка сложности циклических алгоритмов. Примеры.
- •Количество повторений вложенного цикла не зависит от параметра внешнего цикла
- •Количество повторений вложенного цикла зависит от параметра внешнего цикла
- •Оценка сложности рекурсивных алгоритмов: рекурсия с одним и многими рекурсивными вызовами, случай косвенной рекурсии.
- •If … then процедура_1
- •Оптимизация алгоритмов. Примеры.
- •Понятие сложности задачи и классы сложности задач. Понятие сводимости, полиномиальная сводимость.
- •Методы сортировок: сортировка массивов простыми включениями, сортировка массивов простым выбором, сортировка обменами. Анализ сложности алгоритмов сортировки.
- •Сортировка методом простого выбора
- •Сортировка методом простых вставок (метод прямого (простого) включения)
- •2 Пересылки записей
- •1 Пересылка записи
- •Методы сортировок: алгоритм быстрой сортировки. Анализ сложности алгоритма быстрой сортировки.
- •Обзор методов сортировок: сортировка Шелла, пирамидальная сортировка, сортировка слияниями, Шейкер-сортировка, сортировка подсчетом, цифровая сортировка и др.
- •Методы поиска: линейный поиск, метод бинарного поиска, поиск с помощью бинарного дерева, метод случайного поиска и др.
- •Алгоритмы внешней сортировки: метод естественного слияния, метод сбалансированного слияния. Двухпутевая и многопутевая реализации. Фибоначчиева сортировка.
- •Метод квадратичного рехеширования.
- •Рекурсивные типы данных: определение, примеры.
- •Id:integer; {номер вершины}
- •Операции над линейными списками: создание списков, включение элементов в списки (рассмотреть различные способы). Виды связных списков.
- •Операции над линейными списками: удаление элементов списков. Поиск элементов списков, сравнение списков.
- •Операции над бинарными деревьями: включение вершины в дерево. Обход деревьев, подсчет числа вершин в дереве. Подсчет числа вершин, удовлетворяющих заданному условию.
- •Операции над бинарными деревьями: удаление вершины дерева.
- •Понятие сбалансированности бинарного дерева. Приведение дерева к авл-сбалансированному виду: виды и формулы поворотов.
- •Анализ сложности алгоритмов работы с бинарными деревьями.
- •Деревья со многими потомками. Специальные виды деревьев: деревья формул, б-деревья, 2-3 деревья, красно-черные деревья.
- •Понятие графа. Способы представления графов. Операции над графами: добавление вершины, добавление дуги, создание графа.
- •Операции над графами: поиск вершины, удаление вершины, удаление дуги, текстовый вывод графа.
- •Алгоритмы поиска на графах: поиск в глубину и в ширину.
- •Примеры алгоритмов на графах (поиск кратчайшего пути, поиск циклов, алгоритм построения остовного дерева, выделения связных компонентов…).
- •Формальные языки и грамматики. Определение языка, описание языка. Понятие грамматики.
- •Классификация формальных языков. Понятие вывода.
- •Описание синтаксиса языка с помощью синтаксических диаграмм и бнф. Примеры.
- •Основы теории информации. Понятие энтропии. Измерение информации: вероятностный и алфавитный подходы.
- •Основы теории кодирования информации. Метод Шеннона-Фано. Код Хаффмана.
- •1. Принцип программного управления.
- •2. Принцип однородности памяти.
- •3. Принцип адресности.
- •Конвейеризация вычислений.
- •Иерархия запоминающих устройств эвм
- •Устройство процессора. Понятие архитектуры cisc, risc, vliw.
- •Работа процессора
- •Cisc-процессоры
- •Risc-процессоры
- •Misc-процессоры
- •Vliw-процессоры
- •Типы данных, поддерживаемые процессорами Intel, форматы данных.
- •Система команд Intel, классификация команд, форматы команд.
- •Объектно-ориентированное программирование (ооп): основные понятия.
Операции над линейными списками: удаление элементов списков. Поиск элементов списков, сравнение списков.
Удаление элемента this из списка
procedure StrikeOff(var head:reference; this:reference);
var p:reference;
begin
if this=head then
head:=this^.next
else
begin
p:=head;
while p^.next<>this do
p:=p^.next;
p^.next:=this^.next;
end;
dispose(this);
end;
Уничтожение списка
Процедура во время прохождения по списку освобождает память
поэлементно, начиная с головы.
procedure DestroyList(head:reference);
var p:reference;
begin
while head <> nil do
begin
p:=head^.next;
dispose(next);
head:=p;
end;
end;
Поиск элемента в списке
function Search (head: reference; x: integer):reference;
var run:Boolean;
begin
run:=true;
while (head<>nil) and run do
if head^.inf=x then run:=false
else head:=head^.next;
Search:=head;
end;
Рекурсивный вариант процедуры не требует вспомогательной
переменной:
function SearchR (head: reference; x: integer):reference;
begin
if head=nil then SearchR:=nil
else
if head^.inf<>x then
SearchR:=SearchR(head^.next,x)
else SearchR:=head;
end;
Сравнение списков:
Задача решается синхронным проходом по двум линейным спискам и сравнением информационных полей элементов разных списков, находящихся на одинаковом расстоянии от начала. Если какая-то пара не совпадает или списки имеют разную длину, то они считаются различными.
function CompList (head1,head2:reference):Boolean;
var run:Boolean;
begin
run:=true;
while(head1<>nil)and(head2<>nil) and run do
if head1^.inf<>head2^.inf then run:=false
else
begin
head1:=head1^.next;
head2:=head2^.next;
end;
CompList:= (head1=nil)and(head2=nil) and run
end;
Операции над бинарными деревьями: включение вершины в дерево. Обход деревьев, подсчет числа вершин в дереве. Подсчет числа вершин, удовлетворяющих заданному условию.
Дерево состоит из элементов, обычно называемых вершинами или узлами, и связей между вершинами, называемыми дугами или ссылками.
Дерево имеет два свойства:
• оно связно: из корня нужно пройти по дугам к каждой вершине;
• оно не содержит циклов, т.е. замкнутых последовательностей
вершин и дуг.
Бинарное (двоичное) дерево - это дерево, каждая
вершина которого имеет не более двух поддеревьев (левое и правое).
В двоичном дереве поиска для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла.
Тип данных:
type refnode=^node;
node=record inf:integer;
left, right: refnode
end;
Вставка элемента в дерево
Procedure Include(var root : refnode; x : integer);
Begin
if root = nil then
Begin
new(root);
With root^ do
Begin
left := nil;
right := nil;
inf := x;
end;
end
else if x< root^.inf then Include(root^.left, x)
else if x> root^.inf then Include(root^.right, x);
{Иначе ничего не делаем, т.к. значение х уже
существует}
End;
Обходы дерева:
Прямой обход дерева
- вывести значение, находящиеся в корне
- аналогичным образом пройти левое поддерево
- аналогичным образом пройти правое поддерево
Procedure Browser1 (root : refnode);
Begin
if root<> nil then
Begin
Write(root^.inf);
Browser1 (root^.left);
Browser1 (root^.right)
End;
End;
Обратный обход дерева
Левое->корень->правое
Procedure Browser2 (root:refnode);
Begin
if root<> nil then
Begin
Browser2 (root^.left);
Write(root^.inf);
Browser2 (root^.right)
End;
End;
Концевой обход дерева
Левое – правое – корень
Procedure Browser3 (root :
refnode);
Begin
if root<> nil then
Begin
Browser3 (root^.left);
Browser3 (root^.right)
Write(root^.inf);
End;
End;
Подсчет числа вершин + удовлетворяющих условию
С помощью прямого обхода найдем общее количество вершин в переменной i и количество вершин кратных 2 в переменной j. i и j объявлены вне процедуры.
var i,j:integer;
Procedure Browser1 (root : refnode);
Begin
if root<> nil then
Begin
inc(i);
if root^.inf mod 2=0 then inc(j);
Browser1 (root^.left);
Browser1 (root^.right)
End;
End;