Bir ağaç için doğrusal zaman etiketleme algoritması?


12

Köşeleri etiketlemek istediğim yönlendirilmemiş bir ağacım var. Yaprak düğümleri bir tane olarak etiketlenmelidir. Sonra, yaprakların çıkarıldığını varsayın. Kalan ağaçta, yapraklar iki etiketlenmelidir. Bu süreç, tüm köşelerde bir etiket bulunana kadar açık bir şekilde devam eder. Bunu yapmamın nedeni, köşeleri bir kuyrukta saklamak ve onlardan "önce ayrılmak" istiyorum. Bu süresini yapmanın kolay bir yolu var mı ?O(n+m)

Her adımda bir BFS yaparak sorunu çözebilirim. Ama en kötü durumda, her adımda her köşeden geçiyorum, tam olarak iki yaprağı çıkarın ve onları sıkın. Bunun ikinci dereceden zaman aldığını düşünüyorum.

Başka bir fikir, önce tüm yaprakları bulmak ve sonra her yapraktan bir BFS yapmaktı. Bu bana istenen çözümü vermiyor. Örneğin, aşağıdaki şekildeki gibi bir tür "taç grafiği" düşünün. İstenen çözüm gösterilir, ancak her yapraktan bir BFS'nin başlatılması sadece iki etiket kullanılmasına neden olur.

resim açıklamasını buraya girin

İdeal olarak, doğrusal zaman algoritmasının açıklanması ve uygulanması da kolay olacaktır.

Yanıtlar:


8

Köklendirilmemiş Ağaçlar

Bunu içinde çözmek için bir öncelik kuyruğu kullanabilirsiniz :Ö(E+VgünlükV)

  • Tüm köşeleri, öncelikleri derece olmak üzere bir öncelik kuyruğuna koyun.
  • Sıra boş değilken:
    • (veya en sonunda olması gereken minimum önceliğe sahip bir noktasını kaldırın .1 0v10
    • diyelim , burada , tüm orijinal komşularının üzerinden geçer .u vσ(v)=1+maksimumσ(u)uv
    • benzersiz kalan komşusunun (varsa) önceliğinden çıkarın .u1u

Aslında, öncelik sırasına gerçekten ihtiyacımız yoktur ve bu algoritma zamanında basit bir sıra kullanılarak uygulanabilir :Ö(E+V)

  • Tüm köşe noktalarının dereceleriyle birlikte bir uzunluk dizisini başlatın .V
  • Başka bir uzunluk dizisini "canlı" olarak başlatın .V
  • İlk diziye bir kez gidin ve derece tüm köşeleri bir kuyruğa itin .1
  • Sıra boş değilken:
    • Bir köşe Pop .v
    • diyelim , burada , tüm orijinal komşularının üzerinden geçer .u vσ(v)=1+maksimumσ(u)uv
    • Mark "ölü" olarak.v
    • Eğer bazı "diri" komşusu vardır , çıkarma derecesinden .u 1 uvu1u
    • Yeni derecesi ise olduğu , itmek sıraya.1 senu1u

Köklü Ağaçlar

Bunun yerine DFS kullanın. İşte algoritmanın bir taslağı.

  • düğümü verildiğinde , bir yapraksa .v d ( v ) = 1vvd(v)=1
  • Eğer bir yaprak değil, tüm çocuklar üzerinde algoritmayı çalıştırmak ve sonra izin , nereye tüm çocukların grubunun üzerine gider.d ( v ) = 1 + maks d ( u ) uvd(v)=1+maksimumd(u)u

Bu algoritmayı kökte çalıştırırsınız.


Bu doğru mu? 1-> 2-> 3-> 4-> 5 ağacını düşünün; burada 1 köküdür. 2 etiketi 1 almalı, ama 3 verir misiniz? Yoksa çocuklar tarafından komşu mu demek istediniz? Dfs'yi hangi düğümden başlatacağız?
Mart'ta

Uygulamam "birer birer kapalı", ancak açıklamanıza göre , etiketi almalıdır , çünkü , ardından , sonra kaldırmanız gerekir ve ancak o zaman bir yaprak olur. 4 5 4 3 2245432
Yuval Filmus

Soruyu sormadım :-). Soruyu şu şekilde yorumladım: Yönlendirilmemiş bir ağaç. Tüm yaprakları etiketleyin. Onları sil. Ortaya çıkan ağaçta recurse. Bu durumda ağaç aslında 1-2-3-4-5, Adım 1, 1 ve 5, sonra 2 ve 4 ve sonra 3'ü silersiniz. "Taç grafiği" hakkındaki paragrafa bakın. Bu, bir ağacın merkezini bulmak için klasik algoritmalardan biridir.
Mart'ta

1 bir yaprak değildir. Bir yaprak olmaktan çok uzak, kök. Soruyu köklü ağaçları hedef olarak yorumladım. Belki de OP'nin cevap vermesini beklemeliyiz.
Yuval Filmus

2
@YuvalFilmus, sadece 2 sentimi atmak için, mi? Yapraklar , eğer onları silerseniz yeni yapraklar olmalıdır , bu nedenle tepe noktası bir yaprak haline gelmeden önce kaç katmanı silmeniz gerektiğinin bir ölçüsüdür. Min ile, bir yaprağa bitişik herhangi bir tepe noktası 2 alır, ancak yapraklar silindiğinde bir yaprak haline gelmeyebilir. Bu cümlenin içinde çok fazla yaprak vardı. Bir süpürgeye ihtiyacım var. 1+mbirx{d(u)}12
Luke Mathieson

2

Basit bir cevap aşağıdaki gibidir:

  • Bunu yönlendirilmiş bir grafiğe dönüştürün, burada her düğümden üst bir kenar . Bir dag (yönlendirilmiş asiklik grafik) aldığınızı unutmayın.(u,v)uv

  • Grafiği topolojik olarak sıralayın.

  • Köşeleri sıralı olarak tarayın. Her tepe noktasını öncekilerin en büyük etiketlerinden biriyle etiketleyin. Topolojik sırayla Bizler tarama beri öncekilerden tüm biz etiket çalışmadan önce zaten bir etiket almış olacaktır .vv

Bu adımların her biri süresinde yapılabilir, dolayısıyla toplam çalışma süresi . Bu alternatif yaklaşımdan sadece kavramsal olarak anlaşılmasını Yuval'ın cevabından daha kolay bulmanız durumunda bahsedeceğim.Ö(n+m)Ö(n+m)

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.