Saya diberitahu bahwa kami akan menggunakan daftar jika grafik jarang dan matriks jika grafik padat . Bagi saya, itu hanya definisi mentah. Saya tidak melihat banyak hal di luarnya. Bisakah Anda mengklarifikasi kapan akan menjadi pilihan alami?
Terima kasih sebelumnya!
graphs
data-structures
lists
adjacency-matrix
pengguna21312
sumber
sumber
Jawaban:
Pertama-tama perhatikan bahwa jarang berarti Anda memiliki sangat sedikit tepi, dan padat berarti banyak tepi, atau grafik hampir lengkap. Dalam grafik lengkap Anda memiliki edge, di mana n adalah jumlah node.n(n−1)/2 n
Sekarang, ketika kita menggunakan representasi matriks kita mengalokasikan matriks untuk menyimpan informasi simpul-konektivitas, misalnya, M [ i ] [ j ] = 1 jika ada tepi antara node i dan j , jika M [ i ] [ j ] = 0 . Tetapi jika kita menggunakan daftar adjacency maka kita memiliki array node dan masing-masing node menunjuk ke daftar adjacency yang berisi HANYA node-node tetangga .n×n M[i][j]=1 i j M[i][j]=0
Sekarang jika grafik jarang dan kami menggunakan representasi matriks maka sebagian besar sel matriks tetap tidak digunakan yang mengarah pada pemborosan memori. Jadi kita biasanya tidak menggunakan representasi matriks untuk grafik jarang. Kami lebih suka daftar kedekatan.
Tetapi jika grafiknya padat maka jumlah ujungnya mendekati (lengkap) , atau ke n 2 jika grafik diarahkan dengan loop otomatis. Maka tidak ada keuntungan menggunakan daftar adjacency atas matriks.n(n−1)/2 n2
Dalam hal kompleksitas ruang,O(n2)
O(n+m)
n m
matriks Adjacency: Daftar Adjacency: O ( n + m ) di mana n adalah jumlah node, m adalah jumlah tepi.
Ketika grafik tidak diarahkan pohon makaO ( n2)
O ( n + n ) O ( n ) n2
Adjacency matrix: Daftar Adjacency: O ( n + n ) adalah O ( n ) (lebih baik dari n 2 )
Ketika grafik diarahkan, lengkap, dengan loop otomatis makaO ( n2)
O ( n + n2) O ( n2)
Adjacency matrix: Daftar Adjacency: O ( n + n 2 ) adalah O ( n 2 ) (tidak ada perbedaan)
Dan akhirnya, ketika Anda menerapkan menggunakan matriks, memeriksa apakah ada tepi antara dua node membutuhkan kali, sementara dengan daftar adjacency, mungkin butuh waktu linier dalam n .O ( 1 ) n
sumber
Untuk menjawab dengan memberikan analogi sederhana .. Jika Anda harus menyimpan 6oz air, apakah Anda (secara umum) melakukannya dengan wadah 5 galon, atau cangkir 8oz?
Sekarang, kembali ke pertanyaan Anda .. Jika mayoritas matriks Anda kosong, lalu mengapa menggunakannya? Cukup daftarkan setiap nilai saja. Namun, jika daftar Anda sangat panjang, mengapa tidak menggunakan matriks untuk menyingkatnya?
Alasan di balik daftar vs matriks sangat sederhana dalam kasus ini.
Daftar PS benar-benar hanya satu matriks kolom !!! (Mencoba menunjukkan kepada Anda betapa sewenang-wenangnya suatu keputusan / skenario ini)
sumber
Pertimbangkan grafik dengan node dan E edge. Mengabaikan istilah orde rendah, matriks bit untuk grafik menggunakan N 2 bit tidak peduli berapa banyak tepinya.N E N2
Berapa banyak bit yang sebenarnya Anda butuhkan?
Dengan asumsi bahwa tepi adalah independen, jumlah grafik dengan node dan E edge adalah ( N 2N E . Jumlah minimum bit yang diperlukan untuk menyimpan subset ini adalahlog2 ( N2( N2E) .catatan2( N2E)
Kami akan menganggap tanpa kehilangan generalisasi bahwa , yaitu, bahwa setengah atau lebih sedikit dari tepi ada. Jika ini bukan masalahnya, kita dapat menyimpan set "non-edge" sebagai gantinya.E≤ N22
Jika ,log2 ( N 2E= N22 , sehingga representasi matriks optimal asimtotik. JikaE≪N2, menggunakan perkiraan Stirling dan sedikit aritmatika, kami menemukan:catatan2( N2E) =N2+ o ( N2) E≪ N2
=log2(N2)!
Jika Anda menganggap bahwa adalah ukuran bilangan bulat yang dapat mewakili indeks simpul, representasi optimal adalah array dari 2 id simpul E , yaitu array pasangan indeks simpul.catatan2N 2 E
Karena itu, ukuran yang baik dari sparsity adalah entropi, yang juga merupakan jumlah bit per tepi dari representasi optimal. Jika adalah probabilitas bahwa ada sebuah edge, entropinya adalah-log2p(1-p). Untukp≈1p = EN2 - log2p ( 1 - p ) p ≈ 12
sumber