Bitişik listeler veya matrisler ne zaman daha iyi bir seçimdir?


15

Grafiğin seyrek olması durumunda bir liste ve grafiğin yoğun olması durumunda bir matris kullanmamız söylendi . Benim için bu sadece ham bir tanım. Bunun ötesinde fazla bir şey görmüyorum. Ne zaman doğal bir seçim olacağını açıklayabilir misiniz?

Şimdiden teşekkürler!



Bu bir tanım değildir, çünkü çoğunlukla "seyrek" ve "yoğun" un tek bir tanımı yoktur. Ayrıca, başka hususlar da vardır, örneğin grafiğin hangi yönlerine ne sıklıkta eriştiğiniz.
Raphael

@Raphael Diğer hususlar hakkında daha ayrıntılı bilgi verebilir misiniz?
user21312

1
@ user21312, büyük bir fark, kenarlara erişim ve tekrarlanabilirliktir. Sıklıkla kenarlar üzerinde yineleme yapmanız gerekiyorsa, ayar listesi daha yararlı olabilir. Bir kenarın var olup olmadığını sık sık belirlemeniz veya ağırlığına (veya başka bir bilgiye) erişmeniz gerekiyorsa, matris daha iyi olabilir.
ryan

Amacınız için, muhtemelen 'seyrek' ve 'yoğun' tanımının ne olduğu konusunda dikkatsiz olabiliriz. Her veri yapısı türü için kullanmak istediğiniz matris işleminin zaman karmaşıklığını modelleyin ve 'yoğunluk kırılma noktasının' nerede olduğunu görün. Sanırım @ryan tarafından ikinci bağlantı benzer bir şey yapmaya çalışıyor
Apiwat Chantawibul

Yanıtlar:


17

Her şeyden önce, seyrekliğin çok az kenarınız olduğu anlamına gelir ve yoğun , birçok kenar veya neredeyse tam grafik anlamına gelir. Tam bir grafikte kenarınız vardır, burada n düğüm sayısıdır.n(n1)/2n

Şimdi, matris temsilini kullandığımızda, düğüm bağlantısı bilgilerini saklamak için matrisi tahsis ediyoruz , örneğin i ve j düğümleri arasında kenar varsa M [ i ] [ j ] = 1 , aksi takdirde M [ i ] [ j ] = 0 . Ancak bitişiklik listesini kullanırsak, bir dizi düğüme sahibiz ve her düğüm SADECE komşu düğümleri içeren bitişiklik listesine işaret eder .n×nM[i][j]=1ijM[i][j]=0

Şimdi bir grafik seyrekse ve matris temsilini kullanırsak, matris hücrelerinin çoğu kullanılmadan kalır ve bu da bellek israfına yol açar. Bu nedenle, seyrek grafikler için genellikle matris temsilini kullanmayız. Bitişik listeyi tercih ediyoruz.

Ancak grafik yoğunsa, kenar sayısı (tam) veya grafik kendi kendine döngülerle yönlendirilmişse n 2'ye yakındır . O zaman matris üzerinde bitişiklik listesi kullanmanın bir avantajı yoktur.n(n1)/2n2


O(n2)
O(n+m)
nm


O(n2)
O(n+n)O(n)n2


O(n2)
O(n+n2)O(n2)

O(1)n


"Bir bitişik listedeyken, doğrusal zaman alabilir" - Bitişik listenizde (muhtemelen) herhangi bir doğal düzen bulunmadığı düşünüldüğünde, neden karma kümesi yerine bir liste?
Kevin

1
@Kevin Sonra "liste" yerine "bitişik karma" olarak adlandırılır. Ayrıca mümkün, neden olmasın? Ancak sadece DFS veya BFS veya tüm düğümleri sistematik olarak tarayan başka bir prosedür yaparsanız, karma listesi kullanmanın avantajı nedir? Her durumda, tüm bitişik düğümleri kontrol edersiniz.
fade2black

3
Ağırlıksız yönlendirilmemiş durumda, neredeyse tam bir grafik için, tamamlayıcısının, yani seyrek bir grafiğin saklanmasının daha uygun olabileceğini ekleyeceğim . Bu nedenle, kenarların yaklaşık yarısı mevcut olduğunda bir matris yararlıdır.
M. Kış

3

Basit bir benzetme ile cevap vermek için .. 6 oz su depolamak zorunda olsaydınız, (genel olarak konuşursak) 5 galonluk bir kapla mı, yoksa 8 oz bir bardakla mı yapardınız?

Şimdi, sorunuza geri dönün .. Matrisinizin çoğunluğu boşsa, neden kullanıyorsunuz? Bunun yerine her bir değeri listeleyin. Ancak, listeniz gerçekten uzunsa, neden sadece bir matris kullanmıyorsunuz?

Listenin matris karşısındaki mantığı gerçekten bu durumda bu kadar basit.

PS bir liste gerçekten sadece tek bir sütun matris !!! (bunun bir kararın / senaryonun ne kadar keyfi olduğunu göstermeye çalışıyorum)


2

NEN2

Yine de kaç bite ihtiyacınız var?

NE(N2E)log2(N2E)

Genelliği kaybetmeden , yani kenarların yarısının veya daha azının var olduğunu varsayacağız . Aksi takdirde, "kenar olmayan" kümesini saklayabiliriz.EN22

Eğer , matris temsili asimptotik uygun olacak şekilde,. Eğer , Stirling'in tahminini ve biraz aritmetik kullanarak, buluruz:E=N22log2(N2E)=N2+o(N2)EN2

log2(N2E)
=2Elog2N+O(düşük sipariş şartları)
=log2(N2)!E!(N2E)!
=2Elog2N+O(low order terms)

bir düğüm dizinini temsil edebilecek bir tamsayı boyutu olduğunu düşünüyorsanız , en uygun gösterim düğüm kimlikleri dizisidir , yani düğüm dizini çiftleri dizisidir.2 Elog2N2E

Bunu söyledikten sonra, iyi bir seyreklik ölçütü entropidir, ki bu da optimal sunumun kenarı başına bit sayısıdır. Eğer bir kenar mevcut olma olasılığı olan, entropi olduğu . İçin , entropi 2 (en iyi temsil kenar başına yani iki bit) ve grafik yoğundur. Entropi 2'den önemli ölçüde büyükse ve özellikle bir işaretçinin boyutuna yakınsa, grafik seyrek olur. -log2p(1-p)p1p=EN2log2p(1p)p12

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.