Bir süperstarı lineer zamanda nasıl bulabilirim?


28

Yönlendirilmiş grafikleri dikkate alın. Bir süperstar süperstarı olarak adlandırırız ve eğer ondan başka bir düğüme erişilemezse, fakat diğer tüm düğümlerin bir kenarı vardır . resmen:v v

v süperstarı : ⟺Outdeg(v)=0benndeg(v)=n-1

, grafikteki düğüm sayısıyla birlikte . Örneğin, aşağıdaki grafikte, doldurulmamış düğüm bir süperstardır (ve diğer düğümler değildir).n

Bir Superstar
[ kaynak ]

Yönlendirilmiş grafiklerdeki tüm yıldız yıldızları zaman içinde nasıl tanımlayabilirsiniz ? Normal adaylardan uygun bir grafik gösterimi seçilebilir ; Lütfen sorunun karmaşıklığını ön işleme için harekete geçiren ifadeler kullanmaktan kaçının.O(n)

Yoğunluk ile ilgili varsayım yapılamaz. Grafiğin bir süperstar içerdiğini varsaymıyoruz; yok ise, algoritma onu tanımalıdır.

Gösterim : bir düğümün giden kenarların sayısıdır, gelen kenarlar için benzerdir.Outdegbenndeg


1
Biz izin var nerede k kenarları, ya biz sadece bakmak gerekiyor O ( 1 ) her nokta üzerinde kenarları? O(n+k)kO(1)
Kevin

@Kevin Hayır, katı bir gerekliliktir. İkinci soruya gelince: Bunun gerekli olup olmadığını bilmiyorum ama kesinlikle daha fazlasını yapamazsınız. O(n)
Raphael

Cevabı biliyor musun? de yapılabilir mi? O(n)
Dave Clarke

@DaveClarke: Evet ve evet.
Raphael

Temsilciliği daha da kısıtlamalısın; Bir bitişik liste için doğrusal bir algoritma mümkün değildir (sadece bir köşenin bir süperstar olduğunu doğrulamak için, her köşede tüm listeyi gözden geçirmeniz gerekebilir).
Gilles 'SO- kötülükten vazgeç'

Yanıtlar:


18

kenarlarının varlığını kontrol ederek köşelerden birini hariç hepsini ortadan kaldırabiliriz, çünkü kontrol ettiğimiz her kenar için bir olasılığı eleyebiliriz. Giden bir kenar vardır Özellikle, eğer x için y , bunun yok X için ve hareket y (başka bir köşe ondan ulaşılabilir gibi); değilse, bunun yok y (bu ulaşılabilir edilemez x ). Son tepe noktasına ulaştığımızda, hangi köşe kaldırılmamış olursa, diğer köşe ile karşılaştırılmalıdır (süperstar koşulunun korunmasını sağlayın: süperstar olarak elimine edilene veya onaylanıncaya kadar bir kenar girişi vardır, ancak giden bir kenar yoktur). Bazı sahte kod:n-1xyxyyx

vertex superstar(graph g)
    current vertex = first
    # Go through each vertex
    for each subsequent vertex in g ("next")
        # If there's an edge from this to the next, we eliminate this one [move to the new one].
        # If not, we just stay here.
        if edge exists from current to next
            candidate = next
        end if
    end for
    # Now we are on the final remaining candidate, check whether it satisfies the requirements.
    # just a rename for clarity
    candidate = current
    for each other vertex in g
        if edge from current to other exists
            return null 
        else if no edge from other to current
            return null
        end if
    end for
    return candidate
end superstar

Yöntemi göstermek için bir örnek üzerinden geçelim. Bu diziyi üstteki kaynak tepe noktası ve yandaki hedef nokta ile alın. 1 bir kenarı gösterir:

12341-10121-01311-14110-

Potansiyel bir süperstar olarak göz ardı ettiğimiz köşeleri sararım. Baktıkları kenarları belirtmek için yeşil ve kırmızı kullanacağım ve aradıkları kenarı içermediği ve aradıklarımızı belirtmek için mavi olanları kullanacağım.

1. ve 2. köşelere bakarak başlıyoruz.

12341-10121-01311-14110-

12341-10121-01311-14110-

Böyle bir kenar olmadığını görüyoruz, bu yüzden 1'i elimine ediyoruz ve 3'ü mevcut köşemiz olarak alıyoruz. Zaten 2'yi yok ettiğimizi hatırlayın, bu nedenle 4'ten 3'e kadar bir kenar olup olmadığını görün:

12341-10121-01311-14110-

4'ten 3'e kadar bir kenar var, bu yüzden 4'ü eliyoruz. Bu noktada, köşelerden (3) biri hariç hepsini yok ettik, bu yüzden kenarlarını kontrol edin ve kalifiye olup olmadığına bakın:

12341-10121-01311-14110-

1'den 3'e kadar bir kenar var ama tam tersi değil, bu yüzden 3 hala bir aday.

12341-10121-01311-14110-

Ayrıca 2'den 3'e kadar bir kenar da var ama tam tersi değil, bu yüzden 3 hala bir aday.

12341-10121-01311-14110-

4 ila 3 arasında bir kenar vardır ancak 3 ila 4 arasında değildir; Bu, 3'ün kenarlarını kontrol etmemizi tamamlar ve bunun bir süperstar olduğunu tespit ettik.

n-1nnn-12x(n-1)3n-3O(n)Θ(n)


8

Bu Ünlü Sorunu değil mi?

Varsa sadece bir süperstar (ünlü) olacak.

bir[ben,j]=1benj0

bir[ben,j]O(1)bir[ben,j]=1benbir[ben,j]=0j

Birer birer ortadan kaldırarak mevcut adayların bir listesini yapın. Bağlantılı bir liste yeterli olmalıdır.

Sonunda, adayınızın gerçekten bir süperstar olup olmadığını doğrulayabilirsiniz.

O(n)


(ben,j)

3
@Raphael: Bağlantılı listeden ilk iki adayı seç. (kafa ve kafa-> sonraki).
Aryabhata

6

Bu cevap, sorunun güncel versiyonunu değil, herhangi bir grafik gösteriminin mümkün olduğu soruyu açıklar.

  • Grafiğinizi bir çift komşu listesi ve ters komşu listesi olarak saklayın; burada her listenin ek olarak listenin uzunluğunu, bu sayede sırasıyla iç ve dıştaki sayıları içerir.

  • O(|E|)

  • 0n-1O(|N-|)


Tamam, izin görüyoruz herhangi bir grafik gösterimi çok zayıftır. Soruyu istediğim şeyle sınırlandırdım.
Raphael

2

Sadece referans için, bu Kevin'ın gönderdiklerinin özyinelemeli bir versiyonunun sahte kodu.

superstar(V, E) {
  if ( |V| == 1 ) {
    return V.pop
  }

  a = V.pop
  b = V.pop
  if ( (a,b) ∈ E ) {
    no_ss = a
    keep  = b
  }
  else {
    no_ss = b
    keep = a
  }

  s = superstar(V ++ keep)

  return ( s != null && (no_ss, s) ∈ E && !(s, no_ss) ∈ E ) ? s : null
}

hasSuperstar(V, E) = superstar(V, E) != null
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.