Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 16
На сайте нет зарегистрированных пользователей

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

Лабораторная работа по динамическим спискам на Turbo Pascal (перемещение...
Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...
Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы

Представления деревьев. Представление нумерацией связей
(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 October 21 2009 08:42:20 · 0 Комментариев · 8251 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Java Server Pages...
Java в примерах -...
Email
Программирование ...
IIIDTrans
Простой пример ка...
DCAVI
Игра Car [Исходни...
Открытие Cd-ROM'a...
SearchAndReplace
Delphi на примерах
Abc_component
SUIPack
Язык программиров...
Borland Delphi 8 ...
Удаление своего EXE
Run
TrayIcon
Пишем программы и...
WordReport

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97836
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Низкоуровневые кон...
Повышение информац...
10.10.
Азартный гемблинг ...
Информационная сис...
Вычисление определ...
Index TOP 20 (дохо...
Уже забыли пароль?
TABULATE (ЗАНЕСТИ ...
Вулкан Чемпион каз...
Трехразрядный деся...
Управление потоком...
Книга посвящена пр...
Нетиповые операции...
Настройка политики...
• FTP-серверы
Процедура GetArcCo...
Использование объе...
Программирование: ...
Запись данные в по...
Основы PHP
Автошины и диски м...
Эффективное исполь...
Полезные добавки к...
Эффективные разреш...
Статистика



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


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