- •Понятие о структуре данного. Уровни представления структур данных.
- •Классификация сд в программах пользователя и в памяти эвм
- •Сд в оперативной памяти
- •Сд типа массив.
- •Сд типа запись (прямое декартово произведение).
- •Сд типа таблица.
- •Операции над таблицей:
- •Временная сложность алгоритмов.
- •Сд типа хеш-таблица.
- •Операция включения элемента в таблицу.
- •Операция исключения элемента из таблицы:
- •Сортировки. Улучшенные методы сортировок.
- •Классификация задач по временной сложности.
- •Сд типа стек.
- •Алгоритм сортировки Хоара (стек используется для хранения границ сортируемой области в таблице):
- •Сд типа очередь.
- •Связное распределение памяти.
- •Сд типа линейный односвязный список.
- •Сд типа указатель.
- •Статические и динамические переменные.
- •Сд типа циклический линейный список.
- •Сд типа двусвязный линейный список.
- •Сд типа дек.
- •Многосвязные списки.
- •Средства объектно-ориентированного программирования.
- •Объекты и свойства инкапсуляции.
- •Наследование и переопределение.
- •Полиморфизм. Виртуальные методы.
- •Динамические объекты. Деструкторы.
- •Обработка ошибок при работе с динамическими объектами.
- •Модули, экспортирующие объекты.
- •Нелинейные структуры данных.
- •Сд типа дерево.
- •Представление деревьев в связной памяти эвм.
- •Алгоритмы прохождения деревьев в глубину и в ширину.
- •Представление деревьев в виде бинарных.
- •Представление бинарных деревьев в связной памяти. Прошитые деревья
- •Формирование бинарного дерева.
- •Применение бинарных деревьев в алгоритмах поиска.
- •Операция включения в сд типа бинарное дерево.
- •Операция исключения из бинарного дерева.
- •Представление бинарного дерева в прямоугольной памяти.
- •Применение бинарных деревьев.
- •Сд типа граф.
- •Представление графа в памяти эвм.
- •Алгоритмы прохождения графа.
- •Топологическая сортировка.
- •Организация данных во внешней памяти. Типы и характеристики устройств внешней памяти.
- •Сд типа последовательный файл.
- •Сд типа файл прямого доступа.
- •Сд типа индексно-последовательный файл.
- •Сд типа хеш-файл.
- •Внешняя сортировка.
- •Алгоритм прямого слияния.
- •Многофазная сортировка.
- •Сущность базы данных. Системы управления базами данных.
- •Общая структура субд.
- •Реляционная модель субд.
- •Язык реляционной алгебры.
Связное распределение памяти.
Все вышерассмотренные структуры, реализовавшиеся как отображение на массив, обладают определенными недостатками, т.е. они малоэффективны при решении некоторых задач. К таким недостаткам можно отнести следующее:
Определенно неизвестно, сколько элементов будет иметь данная структура, т.е. нельзя сделать оценку.
Если мы рассматриваем некую последовательность элементов в последовательной памяти x1, x2, …, xn и необходимо включить какой-либо новый элемент x в эту последовательность, то мы должны осуществить массовую операцию сдвига всех элементов, находящихся за тем элементом последовательности, после которого мы хотим включить новый элемент. После вставим этот новый элемент x на освободившееся место. Таким образом, здесь проявляется свойство физической смежности.
X1
X2
Xn
X1
X2
Xn
X
X
Избавиться от физической смежности можно, если элементы будут иметь не только данные, но и указатели. В этом случае элементы могут быть хаотически разбросаны по ОП, а логическая последовательность будет обеспечиваться одним или несколькими указателями.
Сд типа линейный односвязный список.
Связный список – СД элементами которой являются записи, связанные друг с другом с помощью указателей, хранящихся в самих элементах.
Связный список |
||||
|
||||
линейный |
нелинейный |
|||
|
||||
односвязный |
двухсвязный |
двухсвязный |
многосвязный |
|
|
||||
циклический |
нециклический |
|
Простейшим связным списком является линейный односвязный список. Каждый элемент в этом списке состоит из различных по назначению полей: содержательного и поля-указателя. В поле-указателе находится адрес следующего элемента. Поле последнего указателя имеет указание на конец списка – признак nil.
Start Ptr
Данные указатель
Данные
указатель
Данные
Операции, определяющие структуру типа линейный односвязный список:
Инициализация.
Включить элемент за рабочий указатель списка.
Исключить элемент, находящийся за рабочим указателем списка.
Передвинуть рабочий указатель на один шаг.
Проверка: список пуст / список не пуст.
Поместить рабочий указатель в начало списка (производная операция).
Поместить рабочий указатель в конец списка (производная операция).
Сделать список пустым.
При инициализации списка эффективно использовать реализацию следующей структуры:
Start Ptr
Фиктивный элемент
Реализацию списка можно осуществить с помощью отображения на массив.
Рассмотрим операции включения и исключения элементов в общем случае. Введем следующие обозначения полей: Data – поле, куда записываются данные; Link – поле, где находится указатель на следующий элемент списка; Start – указатель на начало списка; Free – указатель указывающий на первый элемент свободного (рабочего) списка.
Для реализации необходимо иметь функциональный список, в котором находится поле данных, а также свободный список, являющийся источником данных для функционального. Поле Data в свободном списке не имеет содержательной информации. Data (Ptr) указывает на поле Data того элемента, на который указывает Ptr. Link (Ptr) – указатель того элемента, на который указывает Ptr.
Операции включения и исключения от размерности списка не зависят.
Включение элемента в список:
Pntr = Free;
Free – Link(Pntr);
Data(Pntr) = { };
Link(Pntr) – Link(Ptr) {формируем указатель в новом элементе};
Link(Pntr) = Pntr {модификация указателя}.
Реализация списка в последовательной памяти.
В последовательной памяти список реализуется с помощью двух согласованных массивов, первый из которых используется для записи элементов, а второй – для записи указателей.
Например:
A
B
C D: |
1 |
2 A |
3 C |
4 B |
…... |
N-1 |
N |
|
|
|
|
|
|
|
|
L: |
1
|
2 4 |
3 0 |
4 3 |
…... |
N-1 |
N |
D – массив, используемый для записи элементов, L – массив, используемый для записи указателей, 0 – указатель конца списка.
D: |
1 |
2
|
3
|
4
|
…... |
N-1 |
N |
|
|
|
|
|
|
|
|
L: |
1 1 |
2 3 |
3 4 |
4 5 |
…... |
N-1 N |
N 2 |
Будем считать, что: L [1] будет указывать на первый элемент функционального списка, L [2] – на первый элемент свободного списка.
После инициализации (приведения структуры в начальное состояние) функциональный список – пустой, и мы сделаем его циклическим, а свободный список будут занимать все остальные элементы (его также сделаем циклическим).
Кроме реализации списка в последовательной памяти, связный список можно реализовать также и в динамической памяти (с использованием указательного типа).