|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Есть список Узлов: nodes (node_id, name, gps). Если список Линий: links (node1, node2, name). Линия соединяет между собой два узла. Есть понятие Маршрут — это последовательность (цепочка) из нескольких линий, где конечный Узел одной Линии является начальным Узлом другой Линии. Колец нет, то есть Маршрут это всегда незамкнутая цепочка. Длина цепочки (количество промежуточных узлов) может быть произвольной, их может быть несколько десятков. Данные хранятся в СУБД MySQL, точнее в MariaDB 10. Можно ли с помощью запроса построить все Маршруты? В ряде случаев цепочка может разветвляться, в этом случае Маршрут должен строится по самой длинной цепочке. Не поможете с примером подобного запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 11:52 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Alibek B. Можно ли с помощью запроса построить все Маршруты? Задача довольно мутно сформулирована, но по-любому ответ - нет. Странная идея - решать задачу коммивояжера с помощью SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 12:58 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Alibek B. Можно ли с помощью запроса построить все Маршруты? Можно. А зачем? Не, я бы ещё понял "От А до Б через В". А вот так абстрактно... Я уж не говорю о том, что ты вообще-то их, маршрутов, количество себе представляешь? даже если запрос выполнится (на что у него вряд ли памяти хватит, даже дисковой на кэширование) - он тебе год всё найденное выводить будет... или у тебя там всего десяток узлов? Alibek B. точнее в MariaDB 10. С точностью у тебя как-то нелады. 10,1 и 10,6 - это ну нас только две большие разницы... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 13:11 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Вот пример. 8 узлов, 13 рёбер... и 101 маршрут. https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=19180acdcfac0f42e090d76ed142b991 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 13:32 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
MariaDB 10.0.38. Количество Узлов - порядка тысячи. Количество Линий - порядка тысячи. Количество трасс будет меньше, порядка сотни. Трассы не замкнуты. Выглядеть будет скорее так. Красным нарисована самая длинная трасса. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 16:38 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Тысяча рёбер - это уже минимум тысяча маршрутов. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 19:34 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Поскольку разветвлений не так много, а существенная часть ребер является связной цепочкой и сводится к одному маршруту, то в моем случае маршрутов значительно меньше, чем ребер. Особенно если пропускать те ребра, которые уже считаются частью других маршрутов. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 23:09 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Я не подписал свой рисунок. Но допустим, точки на красной линии можно обозначить как 1, 2, 3, 4 (снизу вверх). Соответственно, красная линия это 1234. Отвод фиолетовой линии будет 5, соответственно фиолетовая линия будет 25. Отвод зеленой линии будет 6, соответственно зеленая линия будет 36. Возможны другие варианты. Например 125, 634, 23. Или 5236, 21, 34. Но в первом случае варианты короче (максимум два сегмента, а 1234 это три сегмента). А во втором случае 5236 равен по длине 1234 и тоже является приемлемым решением. При равной длине выбирается маршрут с меньшим значением node1. Правда я уже понял, что в рамках SQL эту задачу не решить. Потому что в моем случае соединений значительно больше и они более сложные. И какой-нибудь один выбранный маршрут может заблокировать несколько других длинных маршрутов, у которых имеются общие узлы. То есть маршруты нужно выбирать в комплексе с их взаимодействием на другие маршруты. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2022, 23:18 |
|
Рекурсивное соединение произвольного числа записей
|
|||
---|---|---|---|
#18+
Alibek B. , ты что-то не так понимаешь... речь идёт не об окончательных, самых длинных, маршрутах, а вообще о всех возможных, начиная с маршрутов длины 1. Их надо построить абсолютно все - и только потом выбирать самые длинные. На SQL задача решаема - я показал как. Но при тысяче узлов количество всех маршрутов, из которых надо выбирать самые длинные, получится просто астрономическим. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2022, 11:41 |
|
|
start [/forum/topic.php?fid=47&gotonew=1&tid=1827792]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 141ms |
0 / 0 |