Как можно аккуратно изобразить граф на Python ? (Начиная с нуля, т.е. без библиотек!)
Какая структура данных (например, dicts / tuples / dict (кортежи)) будет быстрой, но при этом эффективной с точки зрения памяти?
Над ним нужно уметь выполнять различные операции с графом .
Как уже отмечалось, могут помочь различные представления графов . Как их реализовать на Python?
Что касается библиотек, то на этот вопрос есть неплохие ответы.
python
data-structures
graph
shad0w_wa1k3r
источник
источник
dict
из вариантовlist
. В основном что-то вроде{<parent>: [<child>, ...], ...}
.Ответы:
Несмотря на то, что это несколько старый вопрос, я подумал, что дам практический ответ любому, кто наткнется на него.
Допустим, вы получаете входные данные для своих подключений в виде списка кортежей, например:
Структура данных, которую я считаю наиболее полезной и эффективной для графиков в Python, - это набор наборов . Это будет основная структура нашего
Graph
класса. Вы также должны знать, являются ли эти соединения дугами (направленные, соединяются в одну сторону) или ребрами (неориентированные, соединяются в обе стороны). Мы справимся с этим, добавивdirected
параметр вGraph.__init__
метод. Мы также добавим несколько других полезных методов.Я оставлю это как "упражнение для читателя" по созданию
find_shortest_path
и других методов.Но давайте посмотрим на это в действии ...
источник
heapq
библиотеку для накопления списков кортежей вместо наборов. Например, график будет состоять из кучи вроде:_graph = {'A': heapify([(0.3, 'D'), (0.5, 'B'), (0.75, 'A'), (0.9, 'C')])}
(примечание: вы бы на самом деле не использовалиheapify
это, прочтите справку по библиотеке), тогда вы можете использоватьheapq
функции для вставки и получения взвешенных ребер.log
доступ по времени. Но как расширить словарь, который вы использовали для сопоставления идентификатора узла и веса?NetworkX - потрясающая библиотека графов Python. Вам будет сложно найти то, что вам нужно, чего еще не было.
И это открытый исходный код, поэтому вы можете увидеть, как они реализовали свои алгоритмы. Вы также можете добавить дополнительные алгоритмы.
https://github.com/networkx/networkx/tree/master/networkx/algorithms
источник
graph.py --> class Graph
. И все, что я хочу увидеть, это то, как они используют__iter__
.Во-первых, выбор классического списка или матрицы зависит от цели (от того, что вы хотите делать с представлением). С выбором связаны известные проблемы и алгоритмы. Выбор вида абстрактного представления диктует, как его следует реализовать.
Во-вторых, вопрос в том, должны ли вершины и ребра выражаться только в терминах существования, или они несут дополнительную информацию.
С точки зрения встроенных типов данных Python, любое значение, содержащееся в другом месте, выражается как (скрытая) ссылка на целевой объект. Если это переменная (т.е. именованная ссылка), тогда имя и ссылка всегда хранятся во (внутреннем) словаре. Если вам не нужны имена, тогда ссылку можно сохранить в вашем собственном контейнере - здесь, вероятно, список Python всегда будет использоваться для списка как абстракция.
Список Python реализован как динамический массив ссылок, кортеж Python реализован как статический массив ссылок с постоянным содержимым (значение ссылок не может быть изменено). Благодаря этому их легко индексировать. Таким образом, список можно использовать также для реализации матриц.
Другой способ представления матриц - это массивы, реализованные стандартным модулем
array
- более ограниченные по отношению к хранимому типу, однородное значение. Элементы сохраняют значение напрямую. (Вместо этого в списке хранятся ссылки на объекты значений). Таким образом, это более эффективно использует память, а также ускоряется доступ к значению.Иногда может оказаться полезным даже более ограниченное представление, например
bytearray
.источник
Есть два отличных графа библиотеки NetworkX и igraph . Вы можете найти исходные коды обеих библиотек на GitHub. Всегда можно посмотреть, как написаны функции. Но я предпочитаю NetworkX, потому что его легко понять.
Посмотрите их коды, чтобы узнать, как они выполняют функции. Вы получите несколько идей, а затем сможете выбрать, как вы хотите построить график с использованием структур данных.
источник