Поиск всех циклов в графе и странный набор данных.
От: nen777w  
Дата: 02.04.19 21:06
Оценка:
В одном проекте где я участвую я написал специальную утилиту которая по некоторым данным генерирует файл в формате graphviz

Дальше я написал еще одну утилиту которая читает файл от первой утилиты и ее задача вычленить все циклы в графе и сгенрировать еще один graphviz файл содержащий только циклы.

Для этого я сперва использовал алгоритм из boost::graph::tiernan_all_cycles(), который давал весьма среднюю производительность.
Потом я нашел этот репозиторий https://github.com/ldionne/hawick_circuits/blob/master/boost/graph/hawick_circuits.hpp , и это значительно ускорило обработку файлов.

Могу уверить что файлов из которых требуется вычленить циклы просто тонны.
И второй алогритм (hawick_circuits) например с 100!!! мегабайтный файлом лгеко справляется за минут 20, не говоря о более мелких файлах которые просто пролетают мгновенно.

И тут мне попался один небольшой файл который весит всего 5 мегеабайт. Файлы примерно с таким размером hawick_circuits обрабатывает 2-3 секунды, но этот обрабатывается уже 2-е!!! сутки!!! т.е. больше 48 часов.
Я даже. ради эксперемента, попробовал натравить dot утилиту на него и та уже трудиться над ним более 12-ти часов!!!
И что само интересное, она не падает как обычно это бывает с dot когда он не может справиться с большим файлом.

Т.е. созадется впечатление что алгорим hawick_circuits что dot попросту вошли в бесконечный цикл, и это просто какой то особый случай который приводит к неправильной работе алгоритма (да я понимаю что это вряд ли и возможно это какой кейс где граф с супер высокой связностью, но я лишь говорю о том что вижу сам).

Вопрос, что это может быть?

Если кому интересен файл для анализа (хотя я не очень понимаю как его вобще можно проанализировать), я могу предоставить его.
Отредактировано 02.04.2019 21:07 nen777w . Предыдущая версия . Еще …
Отредактировано 02.04.2019 21:07 nen777w . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.