Bu cevap sadece C ++ için değildir, çünkü bahsedilen her şey, dilden bağımsız olarak veri yapılarının kendisiyle ilgilidir. Ve cevabım, bitişiklik listelerinin ve matrislerinin temel yapısını bildiğinizi varsaymaktır.
Hafıza
Bellek birincil endişenizse, döngülere izin veren basit bir grafik için bu formülü uygulayabilirsiniz:
Bir komşuluk matrisi N kaplar 2 /8 bayt alanı (giriş başına bir bit).
Bir bitişiklik listesi, 8e alanını kaplar, burada e, kenar sayısıdır (32 bit bilgisayar).
Grafiğin yoğunluğunu d = e / n 2 (kenar sayısı bölü maksimum kenar sayısı) olarak tanımlarsak, bir listenin bir matristen daha fazla bellek kapladığı "kesme noktası" nı bulabiliriz:
8e> n 2 /8 d> 1/64
Yani bu sayılarla (hala 32 bit spesifik) kesme noktası 1 / 64'e iner . Yoğunluk (e / n 2 ) 1 / 64'ten büyükse, hafızadan tasarruf etmek istiyorsanız bir matris tercih edilir.
Bunu wikipedia'da (bitişik matrislerle ilgili makale) ve diğer pek çok sitede okuyabilirsiniz .
Yan not : Anahtarların köşe çiftleri olduğu (yalnızca yönlendirilmemiş) bir karma tablo kullanılarak bitişik matrisin alan verimliliği artırılabilir.
Yineleme ve arama
Bitişiklik listeleri, yalnızca mevcut kenarları temsil etmenin kompakt bir yoludur. Bununla birlikte, bu, belirli kenarların muhtemelen yavaşça aranması pahasına gelir. Her liste bir tepe noktası kadar uzun olduğundan, belirli bir kenarı kontrol etmenin en kötü durum arama süresi, liste sıralı değilse O (n) olabilir. Bununla birlikte, bir tepe noktasının komşularına bakmak önemsiz hale gelir ve seyrek veya küçük bir grafik için bitişik listelerde yineleme maliyeti ihmal edilebilir olabilir.
Öte yandan bitişik matrisler, sabit arama süresi sağlamak için daha fazla alan kullanır. Olası her giriş var olduğundan, dizinleri kullanarak sabit zamanda bir kenarın varlığını kontrol edebilirsiniz. Ancak, olası tüm komşuları kontrol etmeniz gerektiğinden komşu araması O (n) alır. Bariz alan dezavantajı, seyrek grafikler için çok fazla dolgu eklenmesidir. Bununla ilgili daha fazla bilgi için yukarıdaki hafıza tartışmasına bakın.
Hala ne kullanacağınızdan emin değilseniz : Gerçek dünyadaki çoğu problem, bitişik liste temsilleri için daha uygun olan seyrek ve / veya büyük grafikler üretir. Uygulanması daha zor görünebilir, ancak sizi temin ederim ki, bir BFS veya DFS yazıp bir düğümün tüm komşularını getirmek istediğinizde, sadece bir satır kod uzaktadırlar. Ancak, genel olarak bitişiklik listelerini desteklemediğimi unutmayın.