Я пытаюсь написать топологическую сортировку в ocaml, но я новичок (в алгоритмах OCaml и graphs), и я не могу сделать это сам.
Мне легче подумать о топологической сортировке, например, в С++ (и есть много примеров топологической сортировки в С++ в Интернете), но я хочу узнать что-то новое. Более того, я нашел несколько примеров топологической сортировки, написанных в OCaml, но я не понимаю их, если честно.
Скажем, у меня есть список (int * int list) list
, например:
myList = [(1, [2]); (5, [6; 7]); (3, [2]); (6, [3; 7]); (8, [7]); (4, [3; 1])];;
а это значит, что мне нужно выполнить задачу 1
перед задачей 2
, task 4
перед задачами 3
и 1
и т.д.
Я думаю, что вывод для этого списка должен быть:
[8; 5; 6; 7; 4; 3; 1; 2]
(однако я не уверен, потому что я просто сделал этот пример, поэтому, если я ошибаюсь, исправьте меня, пожалуйста)
Кроме того, я читал, что топологическая сортировка не работает для циклов в графах, поэтому должно быть какое-то условие для циклов - когда заданный граф имеет цикл (ы), мы поднимаем исключение (я думаю, что это хорошая идея).
AFAIK, мне нужно использовать DFS в алгоритме для топологической сортировки, который (DFS) я не знаю, как реализовать в OCaml (я понимаю основную идею, но я не чувствую, как это работает в OCaml/function программирование).
Я бы очень признателен за вашу помощь в понимании меня этих концепций (я имею в виду топологическую сортировку, DFS в OCaml/функциональное программирование). Если вы можете, было бы здорово, если бы вы показали мне примерные коды, потому что код чтения (для меня) - лучший метод понимания концепции алгоритма.
Я знаю, что для большинства из вас это простой вопрос, но я надеюсь, что он не заставит вас помочь мне.
PS: Я сам изучаю OCaml (я в старшей школе), поэтому у меня нет твердого фона теории (в OCaml или алгоритмах). Я начал изучать OCaml, потому что хотел понять концепцию рекурсии, и теперь этот язык кажется интересным, потому что он действительно отличается от С++, поэтому я все еще пытаюсь узнать что-то новое в OCaml.