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

Структуры и алгоритмы / Типы и структуры данных

.pdf
Скачиваний:
153
Добавлен:
23.02.2015
Размер:
451.95 Кб
Скачать

 

 

S2

S1

 

 

 

 

 

 

 

Данные

Данные

Данные

Данные

P1

 

P1

 

P1

 

 

 

 

 

 

P2

 

 

 

P2

 

P2

 

 

 

 

 

 

 

 

 

Рис.21. Нелинейный связный список:

S1, S2 – указатели начала двух разных односвязных списков, в которые одновременно входит каждый из четырех элементов; указатели S1, S2 являются компонентами двух разных дескрипторов односвязных списков;

P1, P2 – обозначения связок в первом и втором односвязных списках соответственно

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

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

33

S1

100

P1

S2

35

P2

S3

12

P3

S4

15

P4

Данные

P1

P2

P3

P4

Данные

P1

P2

P3

P4

Данные

P1

P2

P3

P4

Данные

P1

P2

P3

P4

Рис. 22. Многосвязный список:

S1 – указатель начала списка сотрудников предприятия;

S2 - указатель начала списка сотрудников, живущих в общежитии; S3 – указатель начала списка семейных сотрудников;

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

34

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

Нелинейные связные списки удобны для представления диаграмм состояний дискретных систем (рис. 23).

На рис. 23 узлы графа соответствуют каждому состоянию системы, дуги обозначают изменение текущего состояния системы. xnyn обозначает, что изменение состояния системы осуществляется под действием входного сигнала xn, и при этом система, переходя в новое состояние, выдает выходной сигнал yn. х1y1 – частный случай: начальное (до поступления входного сигнала) и конечное (после выдачи выходного сигнала) состояние. Состояния могут совпадать.

 

 

 

 

 

 

x1y1

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x6y6

 

 

 

x3y3

 

x2y2

x5y5

 

 

 

2

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x4y4

 

 

 

 

 

 

 

 

 

 

 

Рис. 23. Диаграмма состояния дискретной системы

Многосвязный список, описывающий такую дискретную систему, представлен на рис. 24.

35

Указатель

начала

списка

 

 

 

 

 

1

 

2

 

3

 

 

 

 

 

х1

 

x4

 

х3

y1

 

 

 

 

 

y4

 

y3

 

 

 

 

 

1

 

3

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

х2

 

х5

 

 

 

y5

 

 

y2

 

 

 

 

 

1

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

х6

 

 

 

 

y6

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис.24. Нелинейный список, представляющий диаграмму состояния дискретной системы

В его составе несколько односвязных списков. Один из них содержит элементы, описывающие состояния системы. Каждый элемент такого списка хранит номер соответствующего состояния и два указателя: первый – для связывания всех элементов описания состояния; второй адресует начало списка описаний исходящих дуг данного состояния.

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

36

Таким образом, в пунктирной рамке содержится вся информация о состоянии 1 и ассоциированных с ним выходных дугах.

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

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

Метод счетчиков

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

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

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

37

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

Метод сборки мусора

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

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

38

2.6. Сети

Наиболее общий вид многосвязной структуры – это многосвязная структура, характеризующаяся следующими свойствами:

1.Каждый элемент структуры содержит произвольное число направленных связок с другими элементами (или ссылок на другие элементы).

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

3.Каждая связка в структуре имеет не только направление, но и вес.

Такую многосвязную структуру называют сетевой структурой, сетью, графом или графовой структурой.

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

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

2.7. Деревья

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

1.Существует единственный элемент, на который не ссылается никакой другой элемент. Он называется корнем.

39

2.Начиная с корня и следуя по определенной цепочке указателей, содержащихся в элементах, можно осуществить доступ к любому элементу структуры.

3.На каждый элемент, кроме корня, имеется единственная ссылка, то есть каждый элемент адресуется единственным указателем.

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

Каждая вершина графа (рис.25) ассоциируется с элементом многосвязного списка и называется узлом ветвления, или промежуточным узлом. Узел, который не ссылается ни на какие другие узлы, называется листом. Дуги графа называются ветвями.

У каждого промежуточного узла можно определить предка (родителя, отца) и потомка (сына). Предком данного узла считается тот узел, который ссылается на него. Потомком данного узла считается тот узел, на который он ссылается.

 

 

 

Корень

 

A

 

 

 

 

 

Ветвь

B

C

D

Узел ветвления.

 

 

 

Это потомок

 

 

 

узла A и предок

 

 

 

узла G

E

F

G

Лист

 

 

 

Рис.25. Дерево

Число сыновей у родителя Х называется степенью исхода вершины Х.

Пусть X1, X2, … Xn – такая последовательность узлов дерева, в которой X1 приходится отцом X2, X2 – отцом X3, …, Xn-1 – отцом для Xn. В этом случае при n ≥ 2 говорят, что Xi является предком для Xj, если i < j и 1 ≤ i ≤ n-1, 2 ≤ j ≤ n. А узел Xj называется потомком Xi.

40

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

Вмашинной памяти дерево представляется в виде многосвязного списка, в котором каждый указатель соответствует дуге. Это представление называется естественным представлением дерева.

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

A 3

B

2

 

 

 

C

0

 

D

1

 

 

 

 

 

 

 

 

 

 

 

 

E

0

 

F

0

 

G

0

 

 

 

 

 

 

 

 

 

 

Рис. 26. Естественное представление дерева

Важным частным случаем древовидной структуры является бинарное дерево. Бинарным деревом называется m-арное дерево при m = 2, то есть степень исхода не превышает двух для каждого узла.

Если же степень исхода равна 2 или 0 для каждого узла, то получается полное бинарное дерево.

Любое m-арное дерево может быть преобразовано в бинарное, которое проще исходного с точки зрения изучения, представления в памяти и обработки. Упрощение следует из того, что

41

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

Преобразование произвольного дерева с упорядоченными узлами (то есть X1, X2, … Xn – сыновья одного родителя, причем X1 – старший сын, Xn – самый младший) в бинарное дерево осуществляется следующим образом:

1.В каждом узле исходного дерева вычеркиваются все ветви, кроме самой левой, которая соответствует ссылке на старшего сына (рис.27, а).

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

3.В получившемся дереве левым (старшим) сыном каждого узла Х считается непосредственно стоящий под ним узел (если он есть), а правым (младшим) сыном – соседний справа брат для Х, если он есть (рис. 27,б).

 

A

 

A

 

 

 

B

C

D

B

 

C

D

 

 

E

F

G

E

F

 

G

 

 

 

 

 

а

 

 

 

б

 

Рис. 27. Преобразование произвольного дерева (а) в бинарное (б)

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

42