Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
Имитационное мо... 60728
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,122
новичок: BenderSergey1969
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Обработка задач на ЭВМ на GPSS + Пояснительная записка
Сравнение двух бинарных деревьев на Turbo Pascal + отчет
База данных студентов на Turbo Pascal (Списки) + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Представления деревьев. Представление нумерацией связей
(forward star), описанное ранее, обеспе-
чивает компактное представление деревьев, графов и сетей на основе массивов.
Для хранения дерева с помощью метода нумерации связей в массиве FirstLink
записывается индекс первой ветви, исходящей из каждого узла. В другой массив,
ToNode, заносятся узлы, к которым ведет данная ветвь.
Метка в конце массива FirstLink указывает на точку, расположенную сразу
за последним элементом массива ToNode. Это позволяет легко определить, какие
ветви выходят из каждого узла. Ветви, начинающиеся в узле i, указаны под номе-
рами отFirstLink[i] до FirstLink [i+l]-l.
На рис. 6.7 показано дерево и его представление нумерацией связей. Связи от
узла 3 (обозначенного как D) - это ветви от FirstLink [3 ] до FirstLink [4] -1.
Значение FirstLink [3] =9, a FirstLink [4] =11, поэтому эти ветви обозна-
чены как 9 и 10. Записи массива ToNode для них составляют ToNode [ 9 ] =10
и ToNode [10] =11, следовательно, для узла 3 дочерними являются узлы 10 и 11,
обозначенные как К и L. Это означает, что узел D соединен с К и L.
Дерево и его представление нумерацией связей
Рис. 6.7. Дерево и его представление нумерацией связей
Представление дерева с помощью метода нумерации связей компактно и ос-
новано на массиве, что облегчает запись и чтение деревьев, представленных та-
ким образом, из файлов. Операции над массивами выполняются быстрее, чем опе-
рации с указателями, необходимые при некоторых других представлениях.
По этой причине большая часть литературы по сетевым алгоритмам использу-
ет представление нумерацией связей. Многие статьи о поиске кратчайшего пути
предполагают, что данные записаны в подобном формате. Прежде чем изучать эти
алгоритмы по журналам, таким как Management Science или Operations Research,
вы должны освоить представление нумерацией связей.
С помощью данного метода можно быстро отыскать ветви, исходящие из опре-
деленного узла. С другой стороны, очень сложно изменять структуру данных,
представленных в таком виде. Чтобы добавить новый дочерний узел к узлу А
(см. рис. 6.7), необходимо изменить практически каждый элемент в массивах
ToNode и FirstLink. Сначала необходимо сдвинуть все элементы в массиве ToNode
на одну позицию вправо, чтобы освободить место для новой ветви, затем вставить
новую запись ToNode, которая указывает на новый узел. И наконец, необходимо про-
смотреть весь массив FirstLink, обновив каждый элемент так, чтобы он указывал
на новую позицию соответствующей записи ToNode. Поскольку все записи ToNode
сдвинулись на одну позицию вправо, чтобы освободить место для новой ветви, нуж-
но добавить единицу ко всем задействованным записям FirstLink.
На рис. 6.8 показано дерево после добавления нового узла. Измененные эле-
менты закрашены серым цветом.
Добавление узла
Рис. 6.8. Добавление узла
Удалить узел из начала дерева, представленного нумерацией связей, столь же
трудно, как и добавить. Если удаляемый узел имеет потомков, процесс занимает
еще больше времени, потому что вы также должны удалить и дочерние записи.
Если нужно часто модифицировать дерево, то лучше использовать класс с мас-
сивом или связанным списком указателей на потомков. Такое представление про-
цедур обычно проще понимать и отлаживать. С другой стороны, представление
в виде нумерации связей иногда обеспечивает более высокую производительность
для сложных алгоритмов. Кроме того, это стандартная структура данных, которая
широко освещена в литературе, поэтому вы должны обязательно изучить ее, если
хотите и далее исследовать алгоритмы работы с сетями и деревьями.
Программа FStar использует представление нумерацией связей, чтобы управ-
лять деревом с узлами различных степеней. Она аналогична программе NAry, но
реализует представление на основе массивов. Если вы посмотрите на код програм-
мы FStar, то увидите, насколько сложно в ней добавлять и удалять узлы. Следую-
щий код показывает, каким образом удаляется узел.
// Удаление выделенного узла из дерева.
// У узла не должно быть дочерних.
procedure TFStarTree.RemoveSelected;
var
i, first_link, last._link : Integer;
parent_node, parent_link : Integer;
begin
// Нахождение родительского узла.
parent_node := Node^[Selected].Parent;
first_link := Node^[parent_node].FirstLink;
last_link := Node^[parent_node+l].FirstLink-1;
for parent_link := first_link to last_link do
if (ToNode^[parent_link]=Selected) then break;
// Если родительский узел найден, удаляем его.
if (parent_link<=last_link) then
begin
// Заполнение пустого места в массиве ToNode.
for i := parent_link to NumLinks-1 do
ToNode^[i] := ToNode^[i+1] ;
NumLinks := NumLinks-1; .
// He стоит изменять размеры массива ToNode.
// Обновление записей массива FirstLink.
for i : = 1 to NumNodes do
if (Node^[i].FirstLink>parent_link) then
Node^[i].FirstLink := Node^[i].FirstLink-1;
end;
// Удаление самого узла заполнением пустого места в массиве ToNode.
for i := Selected to NumNodes-1 do
Node^[i] := Node^[i+l] ;
NumNodes := NumNodes-1;
// Обновление записей массива ToNode.
for i := 1 to NumLinks do
if (ToNode'4 [i] >Selected) then
ToNode^[i] := ToNode^[i] -1;
Selected := 0;
end;



Этот код гораздо сложнее, чем соответствующий код программы NAry, исполь-
зующийся для изменения узла с массивом указателей на потомков.
// Удаление дочернего узла.
procedure TNAryNode.RemoveChild(target : TNAryNode);
var
num, I : Integer;
begin
// Нахождение дочернего узла.
for num := 1 to NumChildren do
begin
if (Children^[num] = target) then break;
end;
if (num>NumChildren) then
raise EInvalidOperation.Create(
'Удаляемый узел не является дочерним узлом найденного родителя.');
// Освобождение памяти, занимаемой дочерним узлом.
Children^[num].Free;
// Сдвиг оставшихся дочерних узлов для заполнения пустого места.
for i := num+1 to NumChildren do
Children^[i-1] := Children^[i];
Children^[NumChildren] := nil;
NumChildren := NumChildren-1;
end;


Опубликовал Kest Октябрь 21 2009 12:42:20 · 0 Комментариев · 7490 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Алгоритм трассиро...
Шаблон для новост...
Генетический алго...
XPmenu
SearchAndReplace
LaserTank [Исходн...
Cooltray
Trojan [Исходник ...
IpEditAdress
Х. М. Дейтел, П. ...
Tank [Исходник на...
Пример работы с р...
ScrollCredit
HtmlLerz PRO
Borland Delphi 8 ...
Удаление своего EXE
Длинный заголовок...
Простой пример ка...
EMSQuickImport
JanReplace

Топ загрузок
Приложение Клие... 100532
Delphi 7 Enterp... 92109
Converter AMR<-... 20103
GPSS World Stud... 15495
Borland C++Buil... 13112
Borland Delphi ... 9186
Turbo Pascal fo... 7115
Калькулятор [Ис... 5216
Visual Studio 2... 5037
FreeSMS v1.3.1 3561
Случайные статьи
Упражнения на знан...
Cобытийное моделир...
Коды стран
Встраивайте SQL-за...
Как быть, если хос...
Процедура SetTextJ...
ЭТАП 1. ИДЕНТИФИКА...
КЛАСС ИЛИ ЗАПИСЬ?
Задание нетипизиро...
Поле-шаблон
СТАНДАРТНЫЕ ЧИСЛОВ...
Оптимизация сайта
Адрес блога: дирек...
Книги и статьи
Повторение групп ...
Теория тепловых ст...
Как зарегистрирова...
Объяснение решения
Оформление курсово...
Операционная систе...
Храбрость
Применение простой...
Вычисление хеш-фун...
Установка плагина ...
При перегрузке опе...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?