Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.05.25;
Скачать: CL | DM;

Вниз

Алгоритмы. Обход списка с удалением произвольных элементов   Найти похожие ветки 

 
atruhin ©   (2013-11-22 08:47) [0]

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


 
все арамисы, а я Дартаньян   (2013-11-22 08:50) [1]

если добавит перед собой, то твой алгоритм не сработает


 
Медвешоног Порожок   (2013-11-22 09:19) [2]

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

И чего?
удаленные элементы в следующий цикл перебора не попадут
добавленные наоборот попадут.


 
Jeer ©   (2013-11-22 09:20) [3]

Помечай "галками"


 
RWolf ©   (2013-11-22 09:23) [4]

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


 
DevilDevil ©   (2013-11-22 09:31) [5]

RWolf тему говорит
так - самый быстрый вариант


 
atruhin ©   (2013-11-22 09:33) [6]

>> RWolf ©   (22.11.13 09:23) [4]
Хм. А вот это хороший вариант, в любое время помечать, а собирать мусор при следующем проходе.
Спасибо. Думаю вопрос можно считать закрытым.

PS. Ведь нутром чувствовал, что где то должно быть простое и элегантное решение и не мог сообразить.


 
[ВладОшин] ©   (2013-11-22 09:49) [7]


> Jeer ©   (22.11.13 09:20) [3]
>
> Помечай "галками"

Это разве не тоже самое? :)


 
jumping jack   (2013-11-22 10:11) [8]

atruhin> или добавить
все арамисы, а я Дартаньян> если добавит перед собой, то твой алгоритм не сработает
+1
если процедура такая умная, пусть она итератором и работает (сама индекс инкрементирует и т.п.)


 
Jeer ©   (2013-11-22 11:36) [9]

>Это разве не тоже самое? :)

Разумеется:)

Но это как и в аниме: кто-то смотрит на статичные картинки и видит фильм, да еще и 3D, а кто-то - фигу.



Страницы: 1 вся ветка

Текущий архив: 2014.05.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.005 c
2-1375709808
savek
2013-08-05 17:36
2014.05.25
[Warning] BaseUnit.pas(558): W1000 Symbol Resume is deprecated


2-1375710622
Света
2013-08-05 17:50
2014.05.25
Ускорение свободного падения


15-1384806604
Юрий
2013-11-19 00:30
2014.05.25
С днем рождения ! 19 ноября 2013 вторник


2-1375335686
Den
2013-08-01 09:41
2014.05.25
enumchildwindows вопрос по последнему параметру


2-1375798951
mfender
2013-08-06 18:22
2014.05.25
Появляются лишние символы при отправке TIdMultiPartFormDataStream