Jak można ładnie przedstawić wykres w Pythonie ? (Zaczynając od zera, tj. Bez bibliotek!)
Jaka struktura danych (np. Dykty / krotki / dyktowanie (krotki)) będzie szybka, ale także wydajna pod względem pamięci?
Trzeba umieć wykonywać na nim różne operacje na grafach.
Jak wskazano, pomocne mogą być różne reprezentacje wykresów . Jak się zabrać za implementację ich w Pythonie?
Jeśli chodzi o biblioteki, to pytanie ma całkiem dobre odpowiedzi.
python
data-structures
graph
shad0w_wa1k3r
źródło
źródło
dict
zlist
s. Zasadniczo coś w rodzaju{<parent>: [<child>, ...], ...}
.Odpowiedzi:
Chociaż jest to dość stare pytanie, pomyślałem, że dam praktyczną odpowiedź każdemu, kto się na to natknie.
Załóżmy, że otrzymujesz dane wejściowe dla swoich połączeń jako listę krotek, takich jak:
Struktura danych, którą uważam za najbardziej użyteczną i wydajną dla wykresów w Pythonie, jest dyktatem zbiorów . Będzie to podstawowa struktura naszej
Graph
klasy. Musisz również wiedzieć, czy te połączenia są łukami (skierowane, łączą w jedną stronę) czy krawędziami (niekierowane, łączą w obie strony). Zajmiemy się tym, dodającdirected
parametr doGraph.__init__
metody. Dodamy również kilka innych pomocnych metod.Zostawię to jako „ćwiczenie dla czytelnika” do stworzenia
find_shortest_path
i innych metod.Zobaczmy to jednak w akcji ...
źródło
heapq
biblioteki do układania list krotek zamiast zbiorów. Na przykład wykres składałby się ze stosów, takich jak:_graph = {'A': heapify([(0.3, 'D'), (0.5, 'B'), (0.75, 'A'), (0.9, 'C')])}
(uwaga: nie używałbyśheapify
tego w ten sposób, przeczytaj pomoc do biblioteki), wtedy możesz użyćheapq
funkcji do wstawienia i uzyskania ważonych krawędzi.log
dostęp czasowy. Ale jak rozszerzyć słownik używany do mapowania zarówno nodeID, jak i weight?NetworkX to niesamowita biblioteka grafów Pythona. Trudno będzie znaleźć coś, czego potrzebujesz, czego jeszcze nie jest.
Jest to oprogramowanie typu open source, więc możesz zobaczyć, jak zaimplementowali swoje algorytmy. Możesz także dodać dodatkowe algorytmy.
https://github.com/networkx/networkx/tree/master/networkx/algorithms
źródło
graph.py --> class Graph
. Chcę tylko zobaczyć, jak używają__iter__
.Po pierwsze, wybór klasycznej reprezentacji list i macierzy zależy od celu (od tego, co chcesz zrobić z reprezentacją). Z wyborem są związane dobrze znane problemy i algorytmy. Wybór abstrakcyjnego rodzaju reprezentacji decyduje o sposobie jej realizacji.
Po drugie, pytanie brzmi, czy wierzchołki i krawędzie powinny być wyrażone tylko w kategoriach istnienia, czy też zawierają dodatkowe informacje.
Z punktu widzenia wbudowanych typów danych Pythona każda wartość zawarta w innym miejscu jest wyrażana jako (ukryte) odniesienie do obiektu docelowego. Jeśli jest to zmienna (tj. Nazwane odniesienie), to nazwa i odniesienie są zawsze przechowywane w (wewnętrznym) słowniku. Jeśli nie potrzebujemy nazwy, wówczas odniesienia może być przechowywany w swoim własnym pojemniku - tu prawdopodobnie lista Python zawsze będą wykorzystywane do listy jako abstrakcji.
Lista Pythona jest zaimplementowana jako dynamiczna tablica referencji, krotka Pythona jest zaimplementowana jako statyczna tablica referencji o stałej zawartości (wartości referencji nie można zmienić). Dzięki temu można je łatwo indeksować. W ten sposób lista może być wykorzystana również do implementacji macierzy.
Innym sposobem reprezentacji macierzy są tablice zaimplementowane przez standardowy moduł
array
- bardziej ograniczone względem przechowywanego typu, jednorodna wartość. Elementy przechowują wartość bezpośrednio. (Lista zawiera zamiast tego odniesienia do obiektów wartości). W ten sposób jest bardziej wydajny w pamięci, a także dostęp do wartości jest szybszy.Czasami przydatna może być nawet bardziej ograniczona reprezentacja, taka jak
bytearray
.źródło
Istnieją dwie doskonałe biblioteki grafów NetworkX i igraph . Kody źródłowe obu bibliotek można znaleźć w serwisie GitHub. Zawsze możesz zobaczyć, jak napisane są funkcje. Ale wolę NetworkX, ponieważ jest łatwy do zrozumienia.
Zobacz ich kody, aby dowiedzieć się, jak tworzą funkcje. Otrzymasz wiele pomysłów, a następnie możesz wybrać, w jaki sposób chcesz utworzyć wykres przy użyciu struktur danych.
źródło