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