Kapan daftar kedekatan atau matriks pilihan yang lebih baik?

15

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!

pengguna21312
sumber
Itu bukan definisi, terutama karena tidak ada definisi tunggal "jarang" dan "padat". Juga, ada pertimbangan lain, misalnya aspek grafik mana yang Anda akses seberapa sering.
Raphael
@Raphael Bisakah Anda masuk ke detail lebih lanjut tentang pertimbangan lain?
user21312
1
@ user21312, perbedaan besar adalah iterability vs akses edge. Jika Anda sering perlu mengulangi tepi maka daftar adj mungkin lebih berguna. Jika Anda sering perlu menentukan apakah ada tepi atau mengakses bobotnya (atau info lainnya) maka matriks mungkin lebih baik.
ryan
Untuk tujuan Anda, kami mungkin bisa ceroboh tentang apa definisi 'jarang' dan 'padat'. Hanya memodelkan kompleksitas waktu dari operasi matriks yang ingin Anda gunakan untuk setiap jenis struktur data dan melihat di mana 'break point of density'. Saya pikir tautan kedua oleh @ryan sedang mencoba melakukan hal serupa
Apiwat Chantawibul

Jawaban:

17

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(n1)/2n

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×nM[i][j]=1ijM[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(n1)/2n2

Dalam hal kompleksitas ruang,
matriks Adjacency: Daftar Adjacency: O ( n + m ) di mana n adalah jumlah node, m adalah jumlah tepi.O(n2)
O(n+m)
nm

Ketika grafik tidak diarahkan pohon maka
Adjacency matrix: Daftar Adjacency: O ( n + n ) adalah O ( n ) (lebih baik dari n 2 )HAI(n2)
HAI(n+n)HAI(n)n2

Ketika grafik diarahkan, lengkap, dengan loop otomatis maka
Adjacency matrix: Daftar Adjacency: O ( n + n 2 ) adalah O ( n 2 ) (tidak ada perbedaan)HAI(n2)
HAI(n+n2)HAI(n2)

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 .HAI(1)n

fade2black
sumber
"sementara dengan daftar adjacency, mungkin butuh waktu linier" - Mengingat daftar adjacency Anda (mungkin) tidak memiliki urutan alami, mengapa daftar itu bukan hash set?
Kevin
1
@Kevin Kemudian akan disebut "adjacency hash", bukan "daftar". Juga mungkin, mengapa tidak? Tetapi jika Anda hanya melakukan DFS atau BFS, atau beberapa prosedur lain yang memindai secara sistematis semua node, lalu apa keuntungan menggunakan hash over list? Bagaimanapun Anda akan memeriksa semua node yang berdekatan.
fade2black
3
Saya akan menambahkan bahwa dalam kasus tanpa diarahkan unweighted, untuk grafik yang hampir lengkap mungkin lebih layak untuk menyimpan komplemennya, yaitu grafik jarang. Jadi, sebuah matriks berguna ketika kira-kira setengah dari tepiannya ada.
M. Musim Dingin
3

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)

Charles
sumber
2

Pertimbangkan grafik dengan node dan E edge. Mengabaikan istilah orde rendah, matriks bit untuk grafik menggunakan N 2 bit tidak peduli berapa banyak tepinya.NEN2

Berapa banyak bit yang sebenarnya Anda butuhkan?

Dengan asumsi bahwa tepi adalah independen, jumlah grafik dengan node dan E edge adalah ( N 2NE . 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.EN22

Jika ,log2 ( N 2E=N22, sehingga representasi matriks optimal asimtotik. JikaEN2, menggunakan perkiraan Stirling dan sedikit aritmatika, kami menemukan:catatan2(N2E)=N2+Hai(N2)EN2

=log2(N2)!

catatan2(N2E)
=2Elog2N+O(ketentuan pesanan rendah)
=catatan2(N2)!E!(N2-E)!
=2Ecatatan2N+HAI(ketentuan pesanan rendah)

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.catatan2N2E

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). Untukp1hal=EN2-catatan2hal(1-hal)hal12

Nama samaran
sumber