|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.07.2010, 14:25 | #1 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Оптимальное удаление иерарахических структур
В общем есть структура данных, построенная таким образом, что она может включать в себя аналогичные структуры. Ну вроде узлов дерева. Как "красиво" удалить большую ветвь или даже все дерево? Сам думаю использовать рекурсию, нет ли способа быстрей (или проще).
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
01.07.2010, 14:30 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Рекурсия самое надежное.
А можно не удалять а просто пометить как удаленное. А при сохранении (если тебе нужно сохранять будет) просто не идти в удаленную ветку.
I'm learning to live...
|
01.07.2010, 14:31 | #3 |
Телепат с дипломом
Старожил
Регистрация: 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)
Проверь себя! Онлайн тестирование | Мой блог |
01.07.2010, 14:35 | #4 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Это самоделка для будущей статьи в очередной нумер одного широко известного в узких кругах журнала . Ну я просто надеялся, что имеются еще варианты кроме рекурсии. Фактически все элементы хранятся в одном массиве.
Стилет, удалять надо обязательно, считается что работы со структурой будут проводиться интенсивные.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
01.07.2010, 15:28 | #5 |
Телепат с дипломом
Старожил
Регистрация: 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)
Проверь себя! Онлайн тестирование | Мой блог |
01.07.2010, 15:38 | #6 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Собственно следующий вопрос, напрямую связанный с данным. Листьями этого дерева (если можно так сказать) являются строки. Возникают ситуации (не всегда) когда в удаляемой ветке (узле) строка больше не нужна. Сами строки хранятся в динамическом массиве, а в дереве только ссылка на них. Вопрос - как удалить строку из массива? Ведь если я сдвину строки имеется вероятность, что последующие строки являются листьями существующих веток и тогда целостность структуры нарушится .
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
01.07.2010, 15:41 | #7 |
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
Ну или сдвигать все указатели в дереве стоящие после удаленной строки или просто не удалять данную строку (ячейку) и\или заменить на пустую.
Больше способов не вижу...
В планах порабощение вселенной...
|
01.07.2010, 15:45 | #8 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Не удалять нельзя. После значительного времени работы будет существовать большой разреженный массив, то есть по сути это утечка памяти. Я думал так: на место данной строки поставить последнюю строку из массива, и заменять ссылки только для этой строки. Есть ли еще варианты?
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
01.07.2010, 15:46 | #9 |
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
Тогда только сдвигать указатели...но это не есть гуд...
В планах порабощение вселенной...
|
01.07.2010, 15:48 | #10 |
Телепат с дипломом
Старожил
Регистрация: 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)
Проверь себя! Онлайн тестирование | Мой блог |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Массив структур | 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 |