Bagaimana seseorang bisa rapi mewakili grafik di Python ? (Mulai dari awal yaitu tidak ada perpustakaan!)
Apa struktur data (misalnya dicts / tuple / dict (tuple)) yang akan cepat tetapi juga efisien dalam memori?
Seseorang harus dapat melakukan berbagai operasi grafik di atasnya.
Seperti yang ditunjukkan, berbagai representasi grafik mungkin membantu. Bagaimana cara menerapkannya dengan Python?
Mengenai perpustakaan, pertanyaan ini memiliki jawaban yang cukup bagus.
python
data-structures
graph
shad0w_wa1k3r
sumber
sumber
dict
darilist
s. Pada dasarnya seperti itu{<parent>: [<child>, ...], ...}
.Jawaban:
Meskipun ini adalah pertanyaan yang agak lama, saya pikir saya akan memberikan jawaban praktis bagi siapa pun yang tersandung ini.
Katakanlah Anda mendapatkan data masukan untuk koneksi Anda sebagai daftar tupel seperti:
Struktur data yang menurut saya paling berguna dan efisien untuk grafik dengan Python adalah diktik set . Ini akan menjadi struktur yang mendasari
Graph
kelas kita . Anda juga harus tahu apakah koneksi ini busur (diarahkan, terhubung satu arah) atau tepi (tidak diarahkan, terhubung dua arah). Kami akan menanganinya dengan menambahkandirected
parameter keGraph.__init__
metode. Kami juga akan menambahkan beberapa metode bermanfaat lainnya.Saya akan meninggalkannya sebagai "latihan untuk pembaca" untuk membuat
find_shortest_path
dan metode lainnya.Mari kita lihat ini beraksi ...
sumber
heapq
lib untuk menumpuk daftar tupel alih-alih kumpulan. Misalnya grafik akan menjadi dikt heaps seperti:_graph = {'A': heapify([(0.3, 'D'), (0.5, 'B'), (0.75, 'A'), (0.9, 'C')])}
(catatan: Anda tidak akan benar-benar menggunakanheapify
seperti ini, baca bantuan untuk lib), lalu Anda dapat menggunakanheapq
fungsi untuk menyisipkan dan mendapatkan tepi yang diberi bobot.log
akses waktu. Tapi bagaimana cara memperluas kamus yang Anda gunakan untuk memetakan nodeID dan bobot?NetworkX adalah pustaka grafik Python yang mengagumkan. Anda akan kesulitan menemukan sesuatu yang Anda butuhkan yang belum dilakukannya.
Dan ini open source sehingga Anda dapat melihat bagaimana mereka menerapkan algoritme mereka. Anda juga dapat menambahkan algoritme tambahan.
https://github.com/networkx/networkx/tree/master/networkx/algorithms
sumber
graph.py --> class Graph
. Dan yang ingin saya lihat adalah bagaimana mereka menggunakannya__iter__
.Pertama, pilihan representasi daftar vs. matriks bergantung pada tujuan (pada apa yang ingin Anda lakukan dengan representasi tersebut). Masalah dan algoritma terkenal terkait dengan pilihan. Pilihan jenis representasi abstrak menentukan bagaimana hal itu harus dilaksanakan.
Kedua, pertanyaannya adalah apakah simpul dan tepi harus diekspresikan hanya dalam bentuk keberadaan, atau apakah mereka membawa beberapa informasi tambahan.
Dari sudut pandang tipe data bawaan Python, nilai apa pun yang terkandung di tempat lain diekspresikan sebagai referensi (tersembunyi) ke objek target. Jika ini adalah variabel (yaitu referensi bernama), maka nama dan referensi selalu disimpan dalam kamus (internal). Jika Anda tidak membutuhkan nama, maka referensi dapat disimpan di wadah Anda sendiri - di sini mungkin daftar Python akan selalu digunakan untuk daftar sebagai abstraksi.
Daftar Python diimplementasikan sebagai array referensi dinamis, Python tuple diimplementasikan sebagai array statis referensi dengan konten konstan (nilai referensi tidak dapat diubah). Karena itu mereka dapat dengan mudah diindeks. Dengan cara ini, daftar tersebut dapat digunakan juga untuk implementasi matriks.
Cara lain untuk merepresentasikan matriks adalah array yang diimplementasikan oleh modul standar
array
- lebih dibatasi sehubungan dengan tipe yang disimpan, nilai homogen. Elemen menyimpan nilainya secara langsung. (Daftar menyimpan referensi ke objek nilai sebagai gantinya). Dengan cara ini, memori lebih efisien dan akses ke nilai lebih cepat.Terkadang, Anda mungkin menemukan representasi yang lebih terbatas seperti
bytearray
.sumber
Ada dua pustaka grafik NetworkX dan igraph yang sangat baik . Anda dapat menemukan kedua kode sumber pustaka di GitHub. Anda selalu dapat melihat bagaimana fungsi ditulis. Tapi saya lebih suka NetworkX karena mudah dimengerti.
Lihat kode mereka untuk mengetahui bagaimana mereka membuat fungsinya. Anda akan mendapatkan banyak ide dan kemudian dapat memilih bagaimana Anda ingin membuat grafik menggunakan struktur data.
sumber