Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить структуру на цикл 
V
    Опции темы
xTr1m
Дата 14.11.2012, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Доброго времени суток. Есть класс:
Код

class CRelation
{
    CObject *related;
    CObject *relating;
}
В системе есть много объектов, определяющих таким образом древовидную структуру. необходимо написать алгоритм, позволяющий находить циклы в такой структуре.
Пока в голову лезут всякие глупые вещи в лоб, но уже на начальном этапе реализации вижу, что работает долго. Таких объектов-связей около 50000. Буду благодарен за подсказку в каком напрвлении двигаться.

PM MAIL WWW ICQ   Вверх
feodorv
Дата 14.11.2012, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Я бы сделал простой список указателей всех объектов, в начале пустой, возможно, с сортировкой по значению указателя (для быстрого поиска).
Затем обошёл бы всё дерево, от корня, добавляя в список указатель на очередную структуру. Вот если этот указатель уже находится в списке, то имеем цикл.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
xTr1m
Дата 15.11.2012, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Тут забыл конечно уточнить, что один и тот же элемент может встречаться в разных ветках дерева. Но примерно так и сделал. То есть обошел каждую ветку вглубь, запоминая какие элементы уже встречались. И если дубль, то да - цикл. Спасибо.
PM MAIL WWW ICQ   Вверх
xvr
Дата 15.11.2012, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(feodorv @  14.11.2012,  20:14 Найти цитируемый пост)
Затем обошёл бы всё дерево, от корня, добавляя в список указатель на очередную структуру. Вот если этот указатель уже находится в списке, то имеем цикл. 

Не обязательно, это может быть DAG -
Код

 a -> b -> c
 |---------^
Для нахождения циклов применяют более продвинутые алгоритмы - алогритм Тарьяна (пожалуй самый известный). Ну и еще

DFS алгоритм -
http://www.me.utexas.edu/~bard/IP/Handouts/cycles.pdf
http://www.personal.kent.edu/~rmuhamma/Alg...depthSearch.htm

Еще немного -
http://www.ics.uci.edu/~eppstein/161/960220.html
http://dutta.csc.ncsu.edu/csc791_spring07/...its_johnson.pdf
http://en.wikipedia.org/wiki/Strongly_connected_components

Ну и Топологическая Сортировка графа тоже может помочь




PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.