büyüyen yönlendirilmemiş bir grafiğin dengeli bir yayılma ağacını korumak


19

Grafiğe yeni düğümler / kenarlar eklediğim için, bir grafiğin nispeten dengeli bir yayılma ağacını korumanın yollarını arıyorum.

Tek bir düğüm, "kök" olarak başlayan yönlendirilmemiş bir grafik var.

Her adımda, grafiğe ya yeni bir düğümü ve grafiğe bağlayan bir kenarı ya da sadece iki eski düğümü bağlayan yeni bir kenarı eklerim. Grafiği büyüttüğümde, yayılan bir ağacı koruyorum. Çoğu zaman, bu yeni bir düğüm ve kenar eklediğimde, yeni düğümü bağlandığı eski düğümün alt öğesi olarak ayarladığım anlamına gelir.

Yeni düğümlerin eklendiği düzen üzerinde hiçbir kontrolüm yok, bu yüzden yukarıdaki ağaç oluşturma algoritması açıkça dengesiz yayılan ağaçlara yol açabilir.

Yeniden ağaçlandırmada yapılan iş miktarını en aza indirirken, genişleyen ağacı "nispeten dengeli" tutacak çevrimiçi buluşsal yöntemler bilen var mı? Ağaç yapısı üzerinde tam kontrolüm var. Kontrol edemediğim grafik bağlantısı veya yeni düğümlerin eklendiği sıra.

"Dengeli" "yayılma" ve "ağaç" gibi terimlere verilen standart Google yanıtlarının, ikisi de geçerli olmayan ikili ağaçlar ve B ağaçları gibi göründüğünü unutmayın. Grafik düğümlerimde herhangi bir sayıda komşu olabilir, bu nedenle ağaç düğümlerinde ikili ağaç gibi 2 değil, çok sayıda çocuk olabilir. B-ağaçları bitişiklik listelerini değiştirerek dengeyi korurlar ve grafik bağlantısını değiştiremiyorum.


3
Belki de statik bir grafiğin ideal dengeli yayılma ağacının ne olacağı konusunda daha spesifik olsaydınız yardımcı olabilir. Bir BFS ağacı otomatik olarak dengeli bir ağaç olarak iyi bir seçim midir (doğru kökü seçerseniz mümkün olduğunca sığdır veya kökten bağımsız olarak iki faktör içinde)? Her alt ağaçtaki düğüm sayısının, ağacın her yerinde, üst öğedeki düğüm sayısından daha sabit bir faktörle daha küçük olması gerekir mi, eğer öyleyse böyle ağaçları olmayan grafikler için ne yaparsınız?
David Eppstein

Bu çevrimdışı çalışsaydım, tüm grafik bir kerede verilen bir BFS ağacı gerçekten dengeli bir yayılan ağaç olurdu. Her alt ağaçtaki düğüm sayısının, üst öğedeki düğüm sayısından sabit bir faktörle daha küçük olmasına gerek yoktur.
SuperElectric

En iyi ağaçları incelediniz mi? en.wikipedia.org/wiki/Top_tree
Peer Sommerlund

Yanıtlar:


4

Bir kenara her yeni köşe noktası eklediğinizde, seçenekleriniz yoktur. Her yeni kenar eklediğinizde, köke olan geçerli mesafe yeni kenardan daha büyükse, en eski yoldaki eski kenarı kaldırır ve yenisini eklersiniz. Aksi takdirde, ağacınızı değişmeden tutarsınız. Bu şekilde, ağacın seviyelerinin aynı köşeleri içereceği ve bir tepe noktasından köke olan mesafenin BFS ağacındaki mesafeyle aynı olacağı anlamında BFS ağacına çok benzer bir şey elde ettiğinizi düşünüyorum. "ideal dengeli yayılan ağaç" durumunuzu karşılamak için yeterli olup olmadığını bilmiyorum.


2

Sonunda aşağıdakileri yaptım:

Vinicius Santos'un cevabı bunun ilk kısmı. Dediği gibi, herhangi bir kareye ya yeni bir düğüm ve ona bağlanan bir üst-alt kenar eklerim, ya da sadece mevcut iki düğüm arasına bir kenar eklerim. Ebeveyn-çocuk kenarları ağaç yapısını değiştirmek için hiçbir fırsat sunmaz, sadece çapraz kenarlar yapar. A ve B düğümleri arasına, B'nin daha büyük ağaç derinliğine sahip olduğu bir E kenarını eklemeyi düşünün. Eğer (A.depth + 1) <B.depth ise, B.depth'i A'nın çocuğu yaparak azaltabiliriz.

B'nin derinliğini azalttıktan sonra, B'nin komşularını kontrol etmeliyiz, B'nin çocukları olarak derinliklerini azaltıp azaltamayacaklarını görmek için, bu nedenle, B'den X'e kadar bir kenarı geçen bir genişlik ilk geçişi gerçekleştiriyoruz. derinlik + 1 <Y.depth ve Y'yi X'in çocuğu olarak ayarlar.

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.