Все кратчайшие пути между 2 узлами в неориентированном, невзвешенном графе в MySQL и переполнении стека

Мне нужна помощь в реализации проблемы кратчайшего пути в Mysql и Php. Из того, что я знаю, алгоритм BFS — лучший способ найти эти пути в неориентированных и невзвешенных графах. Тем не менее, я должен получить все кратчайшие пути от вершины к другой, и это становится более сложным. Я нашел реализацию Java для этого, но я слишком сложен для того, чтобы переписать его на Sql.

Итак, первый вопрос: где мне делать вычисления? Mysql или Php? Где бы это было быстрее?

Кроме того, BFS лучший вариант для этого? Есть ли что-нибудь проще для реализации решения? Если нет, есть ли у кого-нибудь простой в использовании и адаптированный код, который я мог бы использовать в качестве справочного материала?

Спасибо!

1

Решение

Хранение сложных иерархических данных в плоской реляционной базе данных, такой как MySQL, не является тривиальным, не говоря уже о поиске по алгоритму. Я, конечно, вообще не рекомендую пытаться реализовать алгоритм поиска графа в SQL.

Что касается реализации Breadth First Search в PHP, есть несколько хороших Древовидные реализации в PHP там на GitHub это может помочь. Хорошая статья для справки по работе с btrees в PHPспецифично для PHP. Не достаточно специфичен для взвешенных, неориентированных графиков, но достаточно общий, чтобы он мог предложить немного направления. Поиск в ширину — это, в основном, просто очередь / стек, где вы извлекаете конечные узлы из ветвей, поэтому нетрудно реализовать итеративно или рекурсивно.

На мой взгляд, самый простой способ поиска кратчайшего пути — это Поиск, хотя это не гарантировано, чтобы найти все кратчайшие пути, такие как BFS, так как обычно он останавливается, как только обнаруживается конечный узел, его гораздо проще реализовать, а также невозможно настроить для поиска по всем путям.

Есть также алгоритм Дейкстры, который и A *, и оба довольно популярны для поиска кратчайшего пути. Вот хороший Ответ cs.stackexchange, который я нашел на контрасте между Dijktra и BFS для кратчайшего пути.

Надеюсь, это поможет.

0

Другие решения

Других решений пока нет …