
- •Понятие алгоритма и свойства алгоритмов.
- •Формализация понятия алгоритма: машина Тьюринга. Представление машин Тьюринга с помощью диаграмм. Табличное представление программ машины Тьюринга. Композиция машин Тьюринга. Примеры.
- •Двумерная таблица
- •С помощью диаграммы
- •Формализация понятия алгоритма: нормальные алгорифмы Маркова, определение и выполнение. Примеры.
- •Вычислимые функции. Базовый набор функций и операции над функциями: суперпозиция, примитивная рекурсия, минимизация. Классы вычислимых функций. Примеры.
- •Проблема алгоритмической разрешимости. Примеры неразрешимых алгоритмических проблем.
- •Методы разработки алгоритмов. Суперпозиция, итерация, рекурсия и др.
- •Технология разработки программ. Технология и методы тестирования программ.
- •Составление алгоритма.
- •Создание документации, помощи.
- •Рекурсивные алгоритмы: определение и виды рекурсии. Реализация рекурсии и использование стека. Рекурсия и итерация. Примеры, сравнение.
- •Задача анализа сложности алгоритмов. Временная и емкостная сложности. Оценки сложности. Использование управляющего графа для оценки сложности линейных и ветвящихся алгоритмов.
- •Оценка сложности циклических алгоритмов. Примеры.
- •Количество повторений вложенного цикла не зависит от параметра внешнего цикла
- •Количество повторений вложенного цикла зависит от параметра внешнего цикла
- •Оценка сложности рекурсивных алгоритмов: рекурсия с одним и многими рекурсивными вызовами, случай косвенной рекурсии.
- •If … then процедура_1
- •Оптимизация алгоритмов. Примеры.
- •Понятие сложности задачи и классы сложности задач. Понятие сводимости, полиномиальная сводимость.
- •Методы сортировок: сортировка массивов простыми включениями, сортировка массивов простым выбором, сортировка обменами. Анализ сложности алгоритмов сортировки.
- •Сортировка методом простого выбора
- •Сортировка методом простых вставок (метод прямого (простого) включения)
- •2 Пересылки записей
- •1 Пересылка записи
- •Методы сортировок: алгоритм быстрой сортировки. Анализ сложности алгоритма быстрой сортировки.
- •Обзор методов сортировок: сортировка Шелла, пирамидальная сортировка, сортировка слияниями, Шейкер-сортировка, сортировка подсчетом, цифровая сортировка и др.
- •Методы поиска: линейный поиск, метод бинарного поиска, поиск с помощью бинарного дерева, метод случайного поиска и др.
- •Алгоритмы внешней сортировки: метод естественного слияния, метод сбалансированного слияния. Двухпутевая и многопутевая реализации. Фибоначчиева сортировка.
- •Метод квадратичного рехеширования.
- •Рекурсивные типы данных: определение, примеры.
- •Id:integer; {номер вершины}
- •Операции над линейными списками: создание списков, включение элементов в списки (рассмотреть различные способы). Виды связных списков.
- •Операции над линейными списками: удаление элементов списков. Поиск элементов списков, сравнение списков.
- •Операции над бинарными деревьями: включение вершины в дерево. Обход деревьев, подсчет числа вершин в дереве. Подсчет числа вершин, удовлетворяющих заданному условию.
- •Операции над бинарными деревьями: удаление вершины дерева.
- •Понятие сбалансированности бинарного дерева. Приведение дерева к авл-сбалансированному виду: виды и формулы поворотов.
- •Анализ сложности алгоритмов работы с бинарными деревьями.
- •Деревья со многими потомками. Специальные виды деревьев: деревья формул, б-деревья, 2-3 деревья, красно-черные деревья.
- •Понятие графа. Способы представления графов. Операции над графами: добавление вершины, добавление дуги, создание графа.
- •Операции над графами: поиск вершины, удаление вершины, удаление дуги, текстовый вывод графа.
- •Алгоритмы поиска на графах: поиск в глубину и в ширину.
- •Примеры алгоритмов на графах (поиск кратчайшего пути, поиск циклов, алгоритм построения остовного дерева, выделения связных компонентов…).
- •Формальные языки и грамматики. Определение языка, описание языка. Понятие грамматики.
- •Классификация формальных языков. Понятие вывода.
- •Описание синтаксиса языка с помощью синтаксических диаграмм и бнф. Примеры.
- •Основы теории информации. Понятие энтропии. Измерение информации: вероятностный и алфавитный подходы.
- •Основы теории кодирования информации. Метод Шеннона-Фано. Код Хаффмана.
- •1. Принцип программного управления.
- •2. Принцип однородности памяти.
- •3. Принцип адресности.
- •Конвейеризация вычислений.
- •Иерархия запоминающих устройств эвм
- •Устройство процессора. Понятие архитектуры cisc, risc, vliw.
- •Работа процессора
- •Cisc-процессоры
- •Risc-процессоры
- •Misc-процессоры
- •Vliw-процессоры
- •Типы данных, поддерживаемые процессорами Intel, форматы данных.
- •Система команд Intel, классификация команд, форматы команд.
- •Объектно-ориентированное программирование (ооп): основные понятия.
Метод квадратичного рехеширования.
Отличается от линейного тем, что шаг перебора элементов не линейно зависит от номера попытки найти свободный элемент
a = (h(key) + c*i2) mod N
Благодаря нелинейности такой адресации количество кластеров уменьшается.
Методом цепочек называется метод, в котором для разрешения коллизий во все записи вводятся указатели, используемые для организации списков цепочек переполнения. В случае возникновения коллизии при заполнении таблицы в список для требуемого адреса хеш-таблицы добавляется еще один элемент.
Поиск в хеш-таблице с цепочками переполнения осуществляется следующим образом. Сначала вычисляется адрес по значению ключа. Затем осуществляется последовательный поиск в списке, который связан с вычисленным адресом.
Процедура удаления из таблицы сводится к поиску элемента и его удалению из цепочки переполнения.
Рекурсивные типы данных: определение, примеры.
Пусть описан тип-запись, и одним из полей этой записи является указатель. В этот указатель можно записать адрес, по которому данная запись располагается, либо, что более интересно адрес другой записи того же типа. Это позволяет при помощи указателей создать структуру данных, называемую связанным списком.
Пример описания такой структуры данных:
type PListElement = ^TListElement; TListElement = record <Произвольные поля записи> NextElement: PListElement; End; |
Здесь сначала описывается тип – указатель PListElement на запись типа TListElement. Затем идет описание самого типа записи, одно из полей которой имеет тип PListElement.
Вообще говоря, каждый элемент подобной структуры может содержать сколько угодно указателей на элементы того же типа, что позволяет формировать не только списки, но также деревья и графы.
Деревья:
type refnode=^node;
node=record
inf:integer;
left, right: refnode
end;
Графы:
Type refnode=^node;
refarc=^arc;
node=record {список вершин}
Id:integer; {номер вершины}
infnode:integer; {вес}
next:refnode; {указатель на следующую вершину в списке}
arclist:refarc {указатель на список дуг}
end;
arc=record {список дуг определенной вершины}
infarc:integer; {вес}
next:refarc; {указатель на следующую дугу, исходящую из данной вершины}
adj:refnode {указатель на вершину, в которую ведет данная дуга}
end;
[ЛАБРИС 19:23:00]
>> говоришь определение. говоришь что рек типы используют для описания деревьев и списков, например мы на паскале задрили, вот так вот описывали + интересно заметить, что паскаль поддерживает только косвенную рекурсию в описании типа
Операции над линейными списками: создание списков, включение элементов в списки (рассмотреть различные способы). Виды связных списков.
Работа с динамическими величинами связана с использованием еще одного типа данных — ссылочного типа. Величины, имеющие ссылочный тип, называют указателями.
Указатель содержит адрес поля в динамической памяти, в которой хранится величина определенного типа. Сам указатель располагается в статической памяти.
Выделение памяти:
Память под динамическую величину, связанную с указателем, выделяется
в результате выполнения стандартной процедуры NEW. Формат обращения к
этой процедуре:
NEW(<указатель>);
Освобождение памяти
Стандартная процедура, позволяющая освобождать память от данных, потребность в которых отпала:
DISPOSE(<указатель>);
Например, если динамическая переменная P^ больше не нужна, то оператор:
DISPOSE(P) удалит ее из памяти.
Списком называется структура данных, каждый элемент которой с помощью указателя связывается со следующим элементом.
В односвязном списке каждый элемент состоит из двух различных по
назначению полей: содержательного поля (поле данных) и служебного поля
(поля указателя), где хранится адрес следующего элемента списка. Поле
указателя последнего элемента списка содержит нулевой указатель (Nil),
свидетельствующий о конце списка.
type reference=^element;
element=record
inf:integer;
next:reference;
end;
Элементы списка создаются во время работы программы по мере
необходимости. Также динамически между элементами устанавливаются и
разрушаются связи.
Если указатель ссылается только на следующее звено списка (как
показано на рисунке и в объявленной выше структуре), то такой список
называют однонаправленным, если на следующее и предыдущее звенья —
двунаправленным списком.
Если указатель в последнем звене установлен не в Nil, а ссылается на
заглавное звено списка, то такой список называется кольцевым. Кольцевыми
могут быть и однонаправленные, и двунаправленные списки.
Стек – это линейный список, в котором все включения и исключения (и
обычно всякий доступ) делаются в одном конце списка (в голове списка)
Очередь – это линейный список, в один конец которого добавляются
элементы, а с другого конца исключаются, элементы удаляются из начала
списка, а добавляются в конце списка – как обыкновенная очередь в магазине.
Принцип работы очереди: «первый пришел - первый вышел».
включение элемента в список
Иногда требуется включить новый элемент после или перед указанным элементом списка
(наиболее простым является вставка после указанного элемента):
procedure After(point:reference; x:integer);
var p:reference;
begin
if point<> nil then
begin
new (p);
p^.inf:=x;
p^.next:=point^.next;
point^.next:=p;
end;
end;
Вставка перед указанным (ссылкой point) элементом является более сложной, т.к. не можем двигаться по списку в направлении, обратном ссылкам. Требуется начать с головы списка и двигаться по ссылкам до элемента point, после чего вставить перед ним новый элемент:
procedure Before (var head:reference; point:reference; x:integer);
var p, here:reference;
begin
new (p);
p^.inf:=x;
if point=head then
begin
p^.next:=point;
head:=p
end
else
begin
here:=head;
while here^.next <> point do
here:=here^.next;
here^.next:=p;
p^.next:=point;
end;
end;