Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2010, 14:25   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию Оптимальное удаление иерарахических структур

В общем есть структура данных, построенная таким образом, что она может включать в себя аналогичные структуры. Ну вроде узлов дерева. Как "красиво" удалить большую ветвь или даже все дерево? Сам думаю использовать рекурсию, нет ли способа быстрей (или проще).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 01.07.2010, 14:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Рекурсия самое надежное.
А можно не удалять а просто пометить как удаленное.
А при сохранении (если тебе нужно сохранять будет) просто не идти в удаленную ветку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2010, 14:31   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Это в чем? В Дельфи Owner удаляет автоматически своих подопечных. А в общем случае, все так же, в методе удаления хозяина нужно вызывать процедуру удаления его рабов (поле предусмотреть для этого). В этом случае для программиста все будет неявно, вызвал один раз, а там уже по цепочке они сами поудаляются. Вся работа тогда переноситься на создание, т.е. при создании нужно указывать кто кем владеет.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 01.07.2010, 14:35   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Это самоделка для будущей статьи в очередной нумер одного широко известного в узких кругах журнала . Ну я просто надеялся, что имеются еще варианты кроме рекурсии. Фактически все элементы хранятся в одном массиве.
Стилет, удалять надо обязательно, считается что работы со структурой будут проводиться интенсивные.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 01.07.2010, 15:28   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Бывают случаи когда рекурсию можно заменить другим способом, но обычно этот другой способ намного сложнее и некрасивый, если можно так выразиться. Например обход дерева можно делать и без рекурсии, насколько я помню.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 01.07.2010, 15:38   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Собственно следующий вопрос, напрямую связанный с данным. Листьями этого дерева (если можно так сказать) являются строки. Возникают ситуации (не всегда) когда в удаляемой ветке (узле) строка больше не нужна. Сами строки хранятся в динамическом массиве, а в дереве только ссылка на них. Вопрос - как удалить строку из массива? Ведь если я сдвину строки имеется вероятность, что последующие строки являются листьями существующих веток и тогда целостность структуры нарушится .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 01.07.2010, 15:41   #7
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Ну или сдвигать все указатели в дереве стоящие после удаленной строки или просто не удалять данную строку (ячейку) и\или заменить на пустую.

Больше способов не вижу...
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 01.07.2010, 15:45   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Не удалять нельзя. После значительного времени работы будет существовать большой разреженный массив, то есть по сути это утечка памяти. Я думал так: на место данной строки поставить последнюю строку из массива, и заменять ссылки только для этой строки. Есть ли еще варианты?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 01.07.2010, 15:46   #9
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Тогда только сдвигать указатели...но это не есть гуд...
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 01.07.2010, 15:48   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Как вариант, усложнить массив строк, сделать некий список, чтобы при перемещении строки не теряли своих ссылок. Но тогда усложняется (даже не усложняется, а придется его ввести) поиск по массиву. Можно ассоциированный массив сделать, тогда поиск быстрый, двоичный можно прикрутить.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив структур AndreyT Общие вопросы C/C++ 2 01.06.2010 19:19
Массив структур MLV Общие вопросы C/C++ 6 08.12.2009 20:44
Помогите подобрать оптимальное решение Zeraim Общие вопросы Delphi 11 29.07.2009 15:11
Посоветуйте оптимальное решение Максим_Леонидович Общие вопросы Delphi 7 24.01.2009 12:12
Оптимальное использование буфера вершин и индексов Vedrus Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 08.11.2008 03:46