русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Нелинейные структуры данных

Графы

1  Логическая структура, определения

Граф -  это  сложная  нелинейная  многосвязная  динамическая структура, отображающая свойства и связи сложного объекта.

Многосвязная структура обладает следующими свойствами:
1). на каждый элемент (узел,  вершину) может быть произвольное количество ссылок;
2). каждый элемент может иметь связь с любым количеством  других элементов;
3) каждая связка (ребро, дуга) может иметь направление и вес.
В узлах  графа  содержится  информация об элементах объекта. Связи между узлами задаются  ребрами  графа.  Ребра  графа  могут иметь направленность, показываемую стрелками, тогда они называются ориентированными, ребра без стрелок - неориентированные.

Граф, все связи которого ориентированные,  называется ориентированным графом или орграфом; граф со всеми неориентированными связями - неориентированным графом; граф со связями обоих типов - смешанным графом.
Для ориентированного графа число ребер, входящих в узел, называется полустепенью  захода узла,  выходящих из узла - полустепенью исхода.  Количество входящих и выходящих ребер  может  быть любым,  в том числе и нулевым.  Граф без ребер является нуль-графом.

Если ребрам графа соответствуют некоторые значения,  то граф и ребра называются  взвешеннымиМультиграфом  называется  граф, имеющий параллельные (соединяющие одни и те же вершины) ребра,  в противном случае граф называется простым.

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

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

Логически структура-граф может  быть  представлена  матрицей смежности или матрицей инцидентности.

2  Машинное представление оpгpафов

Существуют два основных метода представления графов в памяти ЭВМ:  матричный, т.е. массивами, и связными нелинейными списками. Выбор  метода представления зависит от природы данных и операций, выполняемых над ними.  Если задача требует большого числа включений и исключений узлов,  то целесообразно представлять граф связными списками;  в противном случае можно  применить  и  матричное представление.
МАТРИЧНОЕ ПРЕДСТАВЛЕНИЕ ОРГРАФОВ. При  использовании  матриц смежности их элементы представляются в памяти ЭВМ элементами массива.  При этом,  для простого графа матрица состоит из  нулей  и единиц,  для  мультиграфа  - из нулей и целых чисел,  указывающих кратность соответствующих ребер, для взвешенного графа - из нулей и вещественных чисел, задающих вес каждого ребра.
СВЯЗНОЕ ПРЕДСТАВЛЕНИЕ ОРГРАФОВ.  Орграф представляется связным нелинейным списком,  если он часто изменяется или если полустепени захода и исхода его узлов велики.  Имеются два основных варианта представления орграфов связными нелинейными списковыми структурами.
В первом варианте два типа элементов - атомарный и узел связи (см. раздел 5.5).
Более рационально представлять граф элементами одного формата, двойными:  атом-указатель и указатель-указатель или тройными: указатель -data/down - указатель (см.раздел 5.5). 

 

Деревья

1  Основные определения

Дерево - это граф, который характеризуется следующими свойствами:

  • Cуществует единственный элемент (узел или вершина), на который не ссылается никакой другой элемент - и который называется КОРНЕМ (рис. 6.8 - A,G,M - корни).
  • Начиная с корня и следуя по определенной  цепочке  указателей, содержащихся в элементах,  можно осуществить доступ к любому элементу структуры.
  • На каждый элемент,  кроме корня,  имеется единственная ссылка, т.е. каждый элемент адресуется единственным указателем.

Ориентированное дерево - это такой ациклический орграф (ориентированный граф),  у которого одна вершина,  называемая корнем, имеет полустепень захода, равную 0, а остальные - полустепени захода,  равные 1.  Ориентированное дерево должно иметь по  крайней мере одну вершину. Изолированная вершина также представляет собой ориентированное дерево.

Вершина ориентированного дерева, полустепень исхода которой равна нулю,  называется КОНЦЕВОЙ (ВИСЯЧЕЙ) вершиной  или  ЛИСТОМ; все остальные вершины дерева называют вершинами ветвления.  Длина пути от корня до некоторой вершины  называется  УРОВНЕМ  (НОМЕРОМ ЯРУСА) этой вершины.  Уровень корня ориентированного дерева равен нулю, а уровень любой другой вершины равен расстоянию (т.е. модулю разности номеров уровней вершин) между этой вершиной и корнем. Ориентированное дерево является ациклическим графом,  все пути  в нем элементарны.
Во многих приложениях относительный порядок следования  вершин  на  каждом отдельном ярусе имеет определенное значение.  При представлении дерева в ЭВМ такой порядок вводится  автоматически, даже если он сам по себе произволен. Порядок следования вершин на некотором ярусе можно легко ввести, помечая одну вершину как первую, другую - как вторую и т.д. Вместо упорядочивания вершин можно задавать порядок на ребрах.  Если в ориентированном дереве на каждом ярусе задан порядок следования вершин, то такое дерево называется УПОРЯДОЧЕННЫМ ДЕРЕВОМ.
Если из  дерева убрать корень и ребра,  соединяющие корень с вершинами первого яруса,  то получится некоторое множество несвязанных деревьев.  Множество несвязанных деревьев называется ЛЕСОМ.

2  Бинарные деревья.

Существуют m-арные деревья, т.е. такие деревья у которых полустепень  исхода  каждой вершины меньше или равна m (где m может быть равно 0,1,2,3 и т.д.). Если полустепень исхода каждой вершины в точности равна либо m, либо нулю, то такое дерево называется ПОЛНЫМ m-АРНЫМ ДЕРЕВОМ.

При m=2  такие  деревья называются соответственно БИНАРНЫМИ, или ПОЛНЫМИ БИНАРНЫМИ.

Представить m-арное дерево в памяти ЭВМ сложно,  т.к. каждый элемент дерева должен содержать столько указателей, сколько ребер выходит из узла (при m-3,4.5.6... соответствует 3,4,5,6... указателей). Это приведет к повышенному расходу памяти ЭВМ, разнообразию исходных элементов и усложнит алгоритмы обработки дерева. Поэтому m-арные деревья, лес необходимо привести к бинарным  для экономии памяти и упрощению алгоритмов. Все узлы бинарного дерева представляются в памяти ЭВМ однотипными элементами с двумя указателями (см.разд.  6,2,5),  кроме того, операции над двоичными деревьями  выполняются просто  и эффективно.

3  Представление любого дерева, леса бинарными деревьями.

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

  • В  каждом  узле  оставить только ветвь к старшему сыну (вертикальное соединение);
  • Соединить горизонтальными ребрами всех братьев одного отца;
  • Таким образом перестроить дерево по правилу: левый сын - вершина, расположенная под данной; правый сын - вершина,  расположенная справа от данной (т.е. на ярусе с ней).
  • Развернуть дерево таким образом,  чтобы все вертикальные ветви отображали левых сыновей, а горизонтальные - правых.

В результате преобразования любого дерева в бинарное  получается дерево в виде левого поддерева, подвешенного к корневой вершине.
В процессе  преобразования  правый указатель каждого узла бинарного дерева будет указывать на соседа по уровню. Если такового нет,  то правый указатель NIL. Левый указатель будет указывать на вершину следующего уровня.  Если таковой нет,  то указатель устанавливается на NIL.

4  Машинное представление деревьев в памяти ЭВМ.

Деревья можно представлять с помощью связных списков и массивов (или последовательных списков).
Чаще всего используется связное представление деревьев,  т.к. оно очень сильно напоминает логическое.  Связное хранение состоит в том,  что задается связь от отца к сыновьям.  В бинарном дереве имеется два указателя,  поэтому удобно узел  представить  в  виде структуры:


LPTR

 DATA

 RPTR

где LPTR - указатель на левое поддерево, RPTR - указатель на правое поддерево, DATA - содержит информацию, связанную с вершиной.

5  Основные операции над деревьями.

Над деревьями определены следующие  основные  операции,  для которых приведены реализующие их программы.

1) Поиск узла с заданным ключом (Find).
2) Добавление нового узла (Dob).
3) Удаление узла (поддерева) (Udal).
4) Обход дерева в определенном порядке:

  • Нисходящий обход (процедура Preorder ,  рекурсивная  процедура r_Preoder);
  • Смешанный  обход  (процедура  Inorder,  рекурсивная процедура r_Inorder);
  • Восходящий обход (процедура Postorder,  рекурсивная процедура r_Postorder).

ПОИСК ЗАПИСИ В ДЕРЕВЕ. Нужная вершина в дереве ищется по ключу. Поиск в бинарном дереве осуществляется следующим образом.

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

1). найдена вершина, содержащая ключ, равный ключу X;
2). в дереве отсутствует вершина,  к которой нужно перейти для выполнения очередного шага поиска.
В первом случае возвращается указатель на найденную вершину. Во втором - указатель на звено, где остановился поиск, (что удобно для построения дерева). 

ДОБАВЛЕНИЕ НОВОГО УЗЛА. Для включения записи в дерево прежде всего нужно найти в дереве ту вершину,  к которой можно "подвести" (присоединить) новую вершину, соответствующую включаемой записи. При этом упорядоченность ключей должна сохраняться.

ОБХОД ДЕРЕВА. Во многих задачах, связанных с деревьями, требуется  осуществить систематический просмотр всех его узлов в определенном порядке.  Такой просмотр называется  прохождением  или обходом дерева. Бинарное дерево можно обходить  тремя  основными  способами: нисходящим, смешанным и восходящим (возможны также обратный нисходящий, обратный смешанный и обратный восходящий обходы). Принятые  выше  названия  методов  обхода связаны с временем обработки корневой вершины: До того как обработаны оба ее поддерева (Preorder),  после того как обработано левое поддерево,  но до того как обработано правое (Inorder), после того как обработаны оба поддерева (Postorder).  Используемые в переводе названия методов отражают направление обхода в дереве:  от  корневой  вершины  вниз  к листьям - нисходящий обход; от листьев вверх к корню - восходящий обход,  и смешанный обход - от самого левого листа  дерева  через корень к самому правому листу.

Схематично алгоритм обхода двоичного дерева в соответствии с нисходящим способом может выглядеть следующим образом:
1). В качестве очередной вершины взять корень  дерева.  Перейти к пункту 2.
2). Произвести обработку очередной вершины в соответствии с требованиями задачи. Перейти к пункту 3.
3)
a).Если очередная вершина имеет обе ветви,  то в  качестве новой вершины  выбрать  ту  вершину,  на  которую ссылается левая ветвь,  а вершину,  на которую ссылается правая ветвь,  занести в стек; перейти к пункту 2;
б) если очередная вершина является конечной,  то выбрать  в    качестве  новой  очередной  вершины вершину из стека,  если он не пуст,  и перейти к пункту 2;  если же стек пуст, то это означает, что обход всего дерева окончен, перейти к пункту 4;
в) если очередная вершина имеет только одну ветвь, то в качестве очередной вершины выбрать ту вершину, на которую эта ветвь указывает, перейти к пункту 2.
4). Конец алгоритма.

ПРОШИВКА БИНАРНЫХ ДЕРЕВЬЕВ.  Под прошивкой дерева понимается замена по определенному правилу пустых указателей на сыновей указателями на последующие узлы, соответствующие обходу.

В бинарном дереве имеется  много  указателей  со значением NIL. В дереве с N вершинами имеется (N+1)  указателей  типа  NIL.  Это  незанятое пространство  можно  использовать для изменения представления деревьев. Пустые указатели заменяются указателями - "нитями", которые адресуют вершины дерева, расположенные выше. При этом дерево прошивается с учетом определенного способа  обхода.  Например, если в поле left некоторой вершины P стоит NIL,  то его можно заменить на адрес, указывающий на предшественника P, в соответствии с тем порядком обхода, для которого прошивается дерево. Аналогично,  если поле right пусто, то указывается преемник P в соответствии  с  порядком обхода.

Поскольку после прошивания дерева поля left  и  right  могут характеризовать  либо структурные связи,  либо "нити",  возникает необходимость различать их,  для этого вводятся в описание структуры  дерева  характеристики левого и правого указателей (FALSE и TRUE).

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

 

6 Сбалансированные деревья

Одним из методов,  улучшающих время поиска в бинарном дереве является создание сбалансированных деревьев обладающих  минимальным временем поиска.

Дерево является СБАЛАНСИРОВАННЫМ тогда и только тогда, когда для каждого узла высота его двух поддеревьев различается не более, чем на 1.

Существуют алгоритмы, выполняющие над  сбалансированным деревом операции вставки и удаление элементов таким образом, что сбалансированность дерева поддерживается. Эти алгоритмы достаточно сложны и затратны. Ниже приводится алгоритм балансировки двоичного дерева, упорядоченного для обхода слева направо.
1). Выполнить обход дерева слева направо и выбрать элементы дерева в упорядоченный линейный список.
2). Выбрать элемент, находящийся в середине этого списка, назначить его корнем нового, сбалансированного дерева.
3). Проделать операции пп 2- 4 с левым подсписком и сформировать левое поддерево
4). Проделать операции пп 2- 4 с правым подсписком и сформировать правое поддерево

Просмотров: 9074

Вернуться в оглавление:Cтруктура и организация данных




Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Полезен материал? Поделись:

Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.