powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Алгоритм Дейкстры (теоретический)
2 сообщений из 2, страница 1 из 1
Алгоритм Дейкстры (теоретический)
    #39583460
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Пытаюсь для разминки ума написать алгоритм Дейкстры для поиска кратчайших путей графа до всех вершин от заданной на чистом SQL с помощью рекурсивного запроса.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with recursive d(node, dist, visited, min_elem, min_dist) as (
  select
    node, -- все вершины графа
    case when node = _init_node then 0 else edges.weight end, -- начальная метка
   '{}'::int[], -- посещенные вершины
   _init_node, -- вершина с минимальной меткой
   0 -- величина минимальной метки
  from nodes
  left join edges on () -- ребра из _init_node

  union all

  select d.node, least(d.min_dist + edges.weight, d.dist), d.visited || d.min_elem,
    first_value(d.node) over (order by d.dist) -- filter (where d.node <> all(d.visited)) не работает
  from d
  join edges on () and d.node_id <> all(d.visited) -- ребра из вершины минимальной меткой
-- не работает, потому что нельзя дважды ссылаться на определяемую реляцию
-- join lateral (select node, dist from d where node <> all(d.visited) order by dist limit 1) as min on true
)



Можно ли как-нибудь извернуться и найти непосещенную вершину с минимальной веткой?
Или принципиально другой подход возможен?
...
Рейтинг: 0 / 0
Алгоритм Дейкстры (теоретический)
    #39583481
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Алгоритм Дейкстры (теоретический)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]