Алгоритмы обучения графу - PullRequest
       2

Алгоритмы обучения графу

11 голосов
/ 27 октября 2010

В алгоритмах я в основном самоучка, и это в основном было хорошо. Тем не менее, у меня возникают проблемы с пониманием алгоритмов графа. Я ищу какой-то справочник, в котором есть понятия и реальный код, чтобы я мог не только выучить теорию (с которой у меня обычно все хорошо), но и почувствовать, как графы представляются и управляются на практике (что у меня обычно есть) труднее понять). Можно ТАК доставить? Все, что угодно - от книг, ссылок до существующих проектов - было бы замечательно, если бы у них была и концепция, и реализация.

Это не зависит от языка, но я больше всего знаком с python и не очень разбираюсь в FP.

Ответы [ 5 ]

6 голосов
/ 27 октября 2010

Оба они очень хороши:

Свободный материал:

1 голос
/ 04 августа 2015

алгоритм Беллмана – Форда : Кратчайший путь от источника ко всем остальным узлам в взвешенном ориентированном графе, даже с весом -eve ребра (не цикл). медленнее, но универсальнее, чем Dijsktra. Сложность: O (| V |. | E |)

BFS: Найти путь от одной заданной вершины к другим узлам в невзвешенном неориентированном графе. Сложность: O (| V | + | E |) . это быстрее, когда вы знаете вершины впереди и используете соответствующую структуру данных, т.е. FIFO Que для определения, какая вершина уже обработана, чем сложность, может быть уменьшена до O (| V |)

DFS: Найти кратчайший путь от источника к другим узлам. в дереве, а также в графике. График может содержать цикл, что означает, что узел можно посещать снова и снова. поэтому мы можем использовать логический массив для отслеживания посещенных узлов. в противном случае алгоритм не остановится. более того, заглядывайте все глубже и глубже и заходите как можно дальше до конца ветки в дереве. Сложность: O (| V | + | E |) . и Сложность: O (| V |) место для хранения вершин.

Алгоритм использования Варшала: Найти все пары кратчайшего пути в направленном невзвешенном графе с весом ребра + eve, -eve (не цикл). но это не возвращает детали самих путей. он может быть использован для определения веса цикла на графике. когда это находит, это заканчивается. он сравнивает все возможные пути через граф между каждой парой вершин. поэтому он использует динамический подход, а не жадный подход. Сложность: O (| V ^ 3 |)

Алгоритм Джонсона: найти все пары кратчайших путей в ориентированном взвешенном разреженном графе, когда вес ребра равен + eve, -eve, но не -eve цикла. сначала он использует алгоритм Бельмана-Форда для вычисления преобразованного графа из исходного графа. это удаляет все весовые края. затем Дейкстра применяется для поиска путей. Сложность: O (V ^ 2 Log V + VE)

Алгоритм Дейкстры: исходная версия этого алгоритма не использует Priority Que, поэтому сложность равна O (| V ^ 2 |) , но более новая версия использует эту структуру данных, поэтому сложность становится равной O (E + V log V) . и это более быстрый алгоритм кратчайшего пути из одного источника. это работает, назначая предварительный вес посещенному узлу и бесконечность непосещенным узлам для посещенного узла, ищет его все не посещенные края и выбирает с минимальным весом. и добавьте его в набор путей.

Алгоритм Крушкала: , чтобы найти MST, где он находит край наименьшего возможного веса, который соединяет любые два дерева в лесу на неориентированном, взвешенном графике. это жадный алгоритм. это также находит Минимальный Охватывающий Лес. Сложность: O (E log V)

Алгоритм Прима: находит подмножество ребер, которые образуют дерево на неориентированном взвешенном графе. но не могу найти MS Forest, как алгоритм Крушкала.

Алгоритм Броувки: Проблема этого алгоритма состоит в том, что веса должны быть уникальными в графе. он находит MST, исследуя каждую вершину, затем помещая с меньшим весом. этот алгоритм параллелен по своей природе, но не быстрее, чем алгоритм Прима.

Та же сложность, что и у алгоритма Крушкала.

1 голос
/ 14 июля 2012

Я бы сказал, что когда вы изучаете какие-либо алгоритмы, не думайте о их кодировании. Алгоритмы полностью математические, и вы должны относиться к ним одинаково. Когда вы изучаете что-то вроде алгоритма Graph Spanner, не думайте, как его кодировать, как представлять их. Сначала оцените, почему алгоритм важен и нетривиален. Тогда попробуйте несколько очень тривиальных решений и сравните их сложность. Далее посмотрите, как выглядят оптимальные решения, и попытайтесь получить их свойства. Используйте бумагу и ручку, а не IDE, попробуйте вывести и доказать леммы и так далее. Затем, наконец, посмотрите, как вы можете написать псевдокод для решения проблемы. Если вы сделаете эти вещи, то вы разработаете тесную связь с алгоритмами, и тогда вы обнаружите, что их гораздо проще решить, поскольку при кодировании вы не думаете, почему я это делаю.

К сожалению, из-за огромных требований к программисту программист в наши дни не математик и сталкивается с проблемами в решении новых задач. Программисты ранних дней, такие как Дон Кнут, Макарти, были математиками и хорошими исследователями. Следовательно, программист в настоящее время является относительно дешевым словом по сравнению с программистами.

1 голос
/ 27 октября 2010

Я многое узнал о графиках из книги, ссылки на которую приведены ниже ... это одна из моих любимых книг:

Курс по комбинаторике
Дж. Х. ван Линтом, Р. М. Уилсоном
Издательство Кембриджского университета
ISBN 0 521 00601 5

1 голос
/ 27 октября 2010

Стив Йегге говорит, это - потрясающая книга об алгоритмах, которые широко используют графики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...