Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AlgStr / Библиотека / ЛЕКЦИИ / PZ01 / Списки, таблицы,Деревья и сети

.doc
Скачиваний:
36
Добавлен:
23.03.2015
Размер:
54.78 Кб
Скачать

Структуры данных и их классификация (списки, таблицы, деревья, сети).

Структуры данных разделяют на два типа: статические и динамические.

—Статические структуры относятся к разряду непримитивных структур, которые, фактически, представляют собой структурированное множество примитивных, базовых, структур. Например, вектор может быть представлен упорядоченным множеством чисел. Поскольку по определению статические структуры отличаются отсутствием изменчивости, память для них выделяется один раз и ее объем остается неизменным до уничтожения структуры.

Динамические структуры по определению характеризуются отсутствием физической смежности элементов структуры в памяти непостоянством и непредсказуемостью размера (числа элементов) структуры в процессе ее обработки.

Поскольку элементы динамической структуры располагаются по непредсказуемым адресам памяти, адрес элемента такой структуры не может быть вычислен из адреса начального или предыдущего элемента. Для установления связи между элементами динамической структуры используются указатели, через которые устанавливаются явные связи между элементами. Такое представление данных в памяти называется связным. Элемент динамической структуры состоит из двух полей:

информационного поля или поля данных, в котором содержатся те данные, ради которых и создается структура; в общем случае информационное поле само является интегрированной структурой - вектором, массивом, другой динамической структурой и т.п.;

поле связок, в котором содержатся один или несколько указателей, связывающий данный элемент с другими элементами структуры;

Когда связное представление данных используется для решения прикладной задачи, для конечного пользователя "видимым" делается только содержимое информационного поля, а поле связок используется только программистом-разработчиком.

Достоинства связного представления данных - в возможности обеспечения значительной изменчивости структур;

размер структуры ограничивается только доступным объемом машинной памяти;

при изменении логической последовательности элементов структуры требуется не перемещение данных в памяти, а только коррекция указателей;

большая гибкость структуры.

Вместе с тем связное представление не лишено и недостатков, основные из которых:

на поля связок расходуется дополнительная память;

доступ к элементам связной структуры может быть менее эффективным по времени.

Последний недостаток является наиболее серьезным и именно им ограничивается применимость связного представления данных. Если в смежном представлении данных для вычисления адреса любого элемента нам во всех случаях достаточно было номера элемента и информации, содержащейся в дескрипторе структуры, то для связного представления адрес элемента не может быть вычислен из исходных данных. Дескриптор связной структуры содержит один или несколько указателей, позволяющих войти в структуру, далее поиск требуемого элемента выполняется следованием по цепочке указателей от элемента к элементу. Поэтому связное представление практически никогда не применяется в задачах, где логическая структура данных имеет вид вектора или массива - с доступом по номеру элемента, но часто применяется в задачах, где логическая структура требует другой исходной информации.

Списки

Рассмотрим структуры данных, которые можно создавать с помощью указателей. Начнём со связных списков. Связанный список представляет собой цепочку записей-узлов, в которой каждая запись содержит основные данные и ссылку на следующую запись в цепочке. Во главе списка находится указатель («корень»), который указывает на первую запись в списке.

Узел списка

Поле nil

указателя

Поле данных

Указателю в последней записи списка обычно присваивается пустое значение (nil), которое служит признаком конца списка. Такая структура является динамической, она может изменяться в процессе выполнения программы. Линейные связные списки являются простейшими динамическими структурами данных.

Основными операциями, которые можно выполнять над списками, являются операции включения записи в список и удаление её из списка. Чтобы добавить в связной список новый узел. Достаточно изменить один указатель, сами узлы при этом перемещаться не должны. Удаление узла также осуществляется изменением соответствующего указателя так, чтобы он ссылался на узел, следующий за удаляемым.

Принято выделять следующие типы связных списков:

- односвязные линейные списки

- односвязные циклические

- двусвязные линейные списки

- двусвязные циклические

Двусвязный список характеризуется наличием пары указателей в каждом элементе: на предыдущий элемент и на следующий. Разновидностью видов линейных списков является кольцевой список, который может быть организован на основе как односвязного, так и двухсвязного списков. При этом в односвязном списке указатель последнего элемента должен указывать на первый элемент; в двухсвязном списке в первом и последнем элементах соответствующие указатели переопределяются.

Деревья

Структура «дерево» представляет собой иерархию элементов, называемых узлами, и является обобщением линейного списка. В списке каждый узел содержит указатель на другой узел. В дереве каждый узел содержит несколько указателей на несколько узлов.

Начальная точка дерева называется корневым узлом. У корневого узла нет входящих в него ветвей, есть только исходящие. Каждый узел, кроме корня, связан с одним узлом на более высоком уровне, называемым исходным узлом для данного узла. Ни один элемент не имеет более одного исходного. Каждый элемент может быть связан с одним или несколькими элементами на более низком уровне. Они называются потомками этой вершины. Последняя, соответственно называется предком. Если вершина не имеет потомков, то она называется терминальной.

1

2 3

4 5 6

На рисунке элемент 1 является корнем, элементы 2-6 —потомками (листьями). Дерево обычно изображается в перевёрнутом виде— с корнем вверху и «листьями» снизу.

Иногда используют термин сбалансированное дерево. В таком дереве каждый узел имеет одинаковое количество ветвей, причём процесс включения новых ветвей в узлы дерева идёт сверху вниз, а на каждом уровне дерева—слева на право.

Сбалансированное дерево Несбалансированное дерево

Физическая организация данных оказывается более простой для дерева с фиксированным числом ветвей, чем для дерева с переменным числом ветвей. Однако большая часть логических организаций данных не может быть задана в виде сбалансированной древовидной структуры, и для их представления требуется переменное число ветвей в каждом узле.

Имеется одна особая категория сбалансированных древовидных структур, в которой допускается не более двух ветвей для одного узла. Такая структура называется двоичным (бинарным) деревом. В бинарном дереве для целочисленных значений часто придерживаются соглашения о том, что во всех левых вершинах должны находится меньшие числа, а в правых—большие. Например:

8

5 12

3 6 9 13

Основными операциями над деревьями являются: создание и удаления дерева, занесение и удаление элемента в дереве, обход дерева.

Сети

Если в отношении между данными порождённый элемент имеет более одного исходного элемента, то это отношение уже нельзя описать как древовидную или иерархическую структуру. Его описывают в виде сетевой структуры.

В сетевой структуре любой элемент может быть связан с любым другим элементом. Пример сетевой структуры:

1 4 1 2 3

  1. 3

Так же как и в случае древовидных структур, сетевую структуру можно описать с помощью исходных и порожденных элементов. В первом примере каждый порожденный элемент имеет два исходных. Во втором примере не показано направлений связи, но какой бы узел не был самым нижним. У него будет два исходных. Удобно нарисовать её так, чтобы порожденные элементы располагались ниже исходных.

При рассмотрении некоторых сетевых структур естественно говорить об уровнях, так же как и в случае древовидных структур. Так в первом и втором примере структуры имеют два и три уровня соответственно.

5