Jawaban ini bukan hanya untuk C ++ karena semua yang disebutkan adalah tentang struktur datanya sendiri, apa pun bahasanya. Dan, jawaban saya adalah mengasumsikan bahwa Anda mengetahui struktur dasar daftar dan matriks kedekatan.
Penyimpanan
Jika memori adalah perhatian utama Anda, Anda dapat mengikuti rumus ini untuk grafik sederhana yang memungkinkan loop:
Matriks adjacency menempati n 2 /8 ruang byte (satu bit per entri).
Daftar kedekatan menempati ruang 8e, di mana e adalah jumlah tepi (komputer 32bit).
Jika kita mendefinisikan kepadatan grafik sebagai d = e / n 2 (jumlah tepi dibagi dengan jumlah maksimum tepi), kita dapat menemukan "breakpoint" di mana daftar menggunakan lebih banyak memori daripada matriks:
8e> n 2 /8 ketika d> 1/64
Jadi dengan angka-angka ini (masih spesifik 32-bit) breakpoint mendarat di 1/64 . Jika densitas (e / n 2 ) lebih besar dari 1/64, maka matriks lebih disukai jika Anda ingin menghemat memori.
Anda dapat membaca tentang ini di wikipedia (artikel tentang matriks adjacency) dan banyak situs lainnya.
Catatan samping : Seseorang dapat meningkatkan efisiensi ruang dari matriks ketetanggaan dengan menggunakan tabel hash di mana kuncinya adalah pasangan simpul (hanya tidak diarahkan).
Iterasi dan pencarian
Daftar kedekatan adalah cara kompak untuk hanya mewakili tepi yang ada. Namun, ini datang dengan biaya pencarian tepi tertentu yang mungkin lambat. Karena setiap daftar sepanjang derajat simpul, waktu pencarian kasus terburuk untuk memeriksa tepi tertentu dapat menjadi O (n), jika daftar tidak berurutan. Namun, mencari tetangga dari simpul menjadi sepele, dan untuk grafik yang jarang atau kecil biaya iterasi melalui daftar kedekatan mungkin dapat diabaikan.
Di sisi lain, matriks kedekatan menggunakan lebih banyak ruang untuk menyediakan waktu pencarian yang konstan. Karena setiap entri yang mungkin ada, Anda dapat memeriksa keberadaan edge dalam waktu yang konstan menggunakan indeks. Namun, pencarian tetangga membutuhkan O (n) karena Anda perlu memeriksa semua tetangga yang memungkinkan. Kelemahan ruang yang jelas adalah bahwa untuk grafik yang jarang, banyak bantalan ditambahkan. Lihat pembahasan memori di atas untuk informasi lebih lanjut tentang ini.
Jika Anda masih tidak yakin apa yang harus digunakan : Sebagian besar masalah dunia nyata menghasilkan grafik yang jarang dan / atau besar, yang lebih cocok untuk representasi daftar kedekatan. Mereka mungkin tampak lebih sulit untuk diterapkan tetapi saya jamin mereka tidak, dan ketika Anda menulis BFS atau DFS dan ingin mengambil semua tetangga dari sebuah node, mereka hanya berjarak satu baris kode. Namun, perhatikan bahwa saya tidak mempromosikan daftar kedekatan secara umum.