Реализация списка падения графика
-
29-09-2019 - |
Вопрос
Я рассматривающую реализацию структуры данных графика и глядя на представление «Список падения». Здесь есть краткое описание этого:
Таким образом, в каждой вершине на графике хранится список тех краев, на которых это инцидент.
Учитывая, что мой график представляет собой направленный график, я не очень понятен из этого описания на пару очков:
- Сам график также хранит список всех краев?
- Вершины только хранят исходящие края или входящие и исходящие?
- Если оба, они в отдельных списках?
Я вполне знаком с другими представлениями графов (списком соседних, матрицей смесью, списком по краям, матрицей заболеваемости), поэтому это не вопрос о реализациях графика в целом, именно этот конкретный.
Любые указатели будут высоко оценены.
Решение 3
Исследовано и мысли об этом дальше, я пришел к выводу, что не существует несовместный список данных графика. Я думаю, что статья Википедии была произведением какой-то путаницы в разуме автора. Спасибо всем, кто прочитал этот вопрос и провел в любое время на это.
Арманд
Другие советы
Я знаю, что я, возможно, поднимаю старый вопрос от мертвых, но я чувствовал, что это целесообразно комментировать.
Вы можете создать структуру графика списка заболеваемости, и вы также можете настроить ее для Digraphs.
Рассмотрим LinkedList<Vertex>
объект и а LinkedList<Edge>
объект. Это позволит вам повторить все ребра и все вершины, но не содержит никакой информации о том, как все подключено.
Скажем, мы добавляем, то несколько LinkedList<Connection>
объекты. На самом деле, один для каждого Vertex
. Отказ А. Connection
просто где Edge
и а Vertex
Встретиться. Таким образом Edge
будет два Connection
Объекты (для неисправного графика) и Vertex
будет иметь один LinkedList<Connection>
объект, представляющий соединения с каждым Edge
это связано с этим. По сути, это список заболеваемости.
Вы можете изменить это, чтобы представить диграф, если удалите некоторые из них Connection
объекты. Более конкретно, вам придется выбрать, где не иметь этих ссылок. Вы можете удалить Connection
из связанного LinkedList<Connection>
Если вы не хотите видеть Edge
из Vertex
(Для примера выше, у N2 будет пустой LinkedList<Connection>
). Возможно, вы можете сделать ссылки необязательными на Edge
(Для примера выше, E1 будет иметь один Connection
указывая на N2 и один Connection
NULL, позволяя пересекать от E1 до N2, но не обратно на N1. Ваш выбор, как это реализовать, будет полностью зависит от вас. Один из них более интуитивно понятен - направлены края, поэтому удаление соединений по краям, чтобы определить, каким образом они идут, кажется логичным. Другой может показаться немного более сложным, но остановит вас без необходимости прыгать на края, которые нигде не ведут, когда сначала выполняют широту, и в первую очередь поиск глубины.
В точечной форме:
В моих реализациях списка падения у меня есть. Вам нужно для вашей реализации?
Строго говоря, вы могли бы получить, сохранив только исходящие края. Тем не менее, алгоритмы возврата могут выиграть от возможности отступить по ссылкам, которые они путешествовали. Вы можете реализовать вокруг этого, конечно, с какой -то историей, так что это, вероятно, не так уж и много.
Если вы сделаете обоих, вам, вероятно, понадобится какой-то способ дифференцировать, будь то входящие или исходящие. Это, имея два
LinkedList<Connection>
объекты на вершине или имеющиеboolean pointingToVertex
примитивноConnection
, или что -то еще. Может быть, твойEdge
будет направлено, и не обращаются к краям два края указывают на противоположные пути. Соображения должны быть сделаны в зависимости от потребностей вашей структуры.
Я реализовал список падения следующим образом и не смог найти никаких проблем для Несреженные графики. Отказ Я также внедрил несколько алгоритмов топологии графика.
HashMap<VertexT, HashSet<EdgeT>> incidenceMap;
Используя карту наборов гарантии O (1) для поиска вершин и амортизированной сложности o (1) для вставки и удаления кромки. Сохранение списка падения ребра вместо соседнего списка вершин - это просто способ нести какой-то конкретную информацию самого края. Это также полезно для абстрактных алгоритмов, когда, например, вы связываете вес к краям.
РЕДАКТИРОВАТЬ:
Я обновил разговоры На Wikipedia для темы «Список падения».