Прежде всего, я новичок в Java, поэтому я не уверен, что это вообще возможно! В основном у меня есть огромный (3 + миллион) источник данных реляционных данных (т.е. A дружит с B+C+D, B дружит с D+G+Z (но не A - т.е. не взаимным) и т. д.), и я хочу найти каждый цикл в этом (не обязательно связном) ориентированном графе.
Я нашел поток Поиск всех циклов в графике, который указал мне на (элементарный) алгоритм поиска циклов Дональда Джонсона, который, по крайней мере внешне, выглядит так, как будто он сделает то, что мне нужно (я собираюсь попробовать, когда вернусь на работу во вторник - думал, что это не сработает). пока не больно спрашивать!).
Я быстро просмотрел код Java-реализации алгоритма Джонсона (в этом потоке), и похоже, что матрица отношений - это первый шаг, поэтому я думаю, что мои вопросы таковы:
а) Способна ли Java обрабатывать матрицу 3+миллион*3+миллион? (планировал представить A-друзей-с-B бинарной разреженной матрицей)
б) Должен ли я найти каждый связанный подграф в качестве моей первой задачи, или алгоритмы поиска циклов будут обрабатывать непересекающиеся данные?
в) Действительно ли это подходящее решение проблемы? Мое понимание «элементарных» циклов заключается в том, что на приведенном ниже графике вместо выбора A-B-C-D-E-F будут выбраны A-B-F, B-C-D и т. д., но это не конец света, учитывая задачу.
E
/ \
D---F
/ \ / \
C---B---A
г) Если нужно, я могу упростить задачу, обеспечив взаимность в отношениях, т.е. А-друзья-с-Б ‹==> Б-друзья-с-А, а если очень нужно, я, может быть, и урежу объем данных, но на самом деле он всегда будет около отметки в 1 мил.
z) Это задача P или NP?! Я откусываю больше, чем могу прожевать?
Спасибо всем, любая помощь приветствуется! Энди