У меня есть древовидная структура, очень похожая на DOM.
Мне нужно отладить его и очистить от круговых ссылок (дочерний элемент является родителем родителя).
Я помню, что есть алгоритм для этого, не могу запомнить имя.
Какое имя.Как найти круговые ссылки в дереве
ответ
Прогулка по дереву с использованием любого удобного алгоритма; поиск по глубине обычно является хорошим кандидатом. Следите за каждым узлом, который вы посещаете. Если вы дважды посещаете узел, у вас есть потенциальная округлость, которую вы могли бы разбить на эту конкретную округлость, удалив ссылку, которая приведет к пересмотренному узлу. Но это может быть просто объединение, что делает дерево ориентированным ациклическим графом (DAG). (См. Диаграмму ниже.)
Если вы в порядке с DAG, но не с округлостью, тогда вам нужно различать два случая. Самый простой способ - поддерживать два флага для каждого узла вместо одного: visited
и completed
. В DFS вы отмечаете узел как посещенный перед посещением детей и завершаетесь после посещения детей. (Если это лист, просто дать ему обе метки.) Теперь, есть три возможности при первом посещении узла:
Нет меток. Не беспокойся.
посетили, но не завершена: округлость
посетили и закончил: ациклический алмаз
Последний случай выглядит примерно так:
root
/\
/ \
/ \
a b
/\ /\
/ \/ \
/ \/ \
c join d
- 1. Как идентифицировать круговые ссылки в огромном проекте
- 2. Круговые ссылки Python
- 3. Круговые ссылки Java
- 4. Доктрина крепления - круговые ссылки
- 5. удалить круговые символические ссылки
- 6. Возможные круговые ссылки?
- 7. «Круговые ссылки» в JPA - антипаттерн?
- 8. Excel Расчеты и круговые ссылки
- 9. TcpConnectionFactoryFactoryBean не поддерживает круговые ссылки?
- 10. Как обойти круговые ссылки при использовании Gson?
- 11. Как создать круговые ссылки с помощью прибора?
- 12. Как найти проект в дереве?
- 13. Как найти родителя в дереве
- 14. Как найти предшественника в дереве
- 15. Можно ли создавать круговые ссылки в Clojure?
- 16. Как узнать, какие конкретные круговые ссылки присутствуют в коде
- 17. Losing ссылки в дереве AVL
- 18. Как сохранить графики, представляющие круговые ссылки в Voyage?
- 19. MVC3 JsonSerializer находит загадочные круговые ссылки?
- 20. Найти круговые круги на картинке
- 21. Поиск перекрестной ссылки в двоичном дереве
- 22. Объекты JPA, круговые ссылки и toString()
- 23. WcfTestClient.exe не способен обрабатывать круговые ссылки?
- 24. javascript, круговые ссылки и утечки памяти
- 25. Как обойти круговые ссылки в веб-проекте Visual Studio?
- 26. Найти максимальный элемент в дереве
- 27. Как найти определенный узел в двоичном дереве?
- 28. DecisionTrees - как найти количество листьев в дереве?
- 29. Как найти выбранный узел в дереве?
- 30. Как найти NodeData в дереве узлов?
[Черепаха и заяц алгоритм] (http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare)? – Kevin
Вы можете использовать топологическую сортировку для поиска циклов в ориентированных графах. – Lee