Używam algorytmu Lengauera i Tarjana z kompresją ścieżek do obliczenia drzewa dominującego dla wykresu, na którym są miliony węzłów. Algorytm jest dość skomplikowany i muszę przyznać, że nie poświęciłem czasu, aby go w pełni zrozumieć, po prostu go używam. Teraz potrzebuję obliczyć drzewa dominujące bezpośrednich potomków węzła głównego i ewentualnie powrócić na dół wykresu do pewnej głębokości powtarzającej tę operację. To znaczy. kiedy obliczam drzewo dominujące dla potomka węzła głównego, chcę udawać, że węzeł główny został usunięty z wykresu.Wydajny sposób rekurencyjnie obliczyć drzewo Dominator?
Moje pytanie brzmi: czy istnieje skuteczne rozwiązanie tego problemu, które wykorzystuje natychmiastowe informacje o dominatorze, które zostały już obliczone w drzewie początkowego dominatora dla węzła głównego? Innymi słowy, nie chcę zaczynać od zera dla każdego z dzieci, ponieważ cały proces jest dość czasochłonny.
Naiwnie wydaje się, że jest to możliwe, ponieważ na wykresie będzie dużo węzłów w głąb wykresu, których idomy znajdują się nieco wyżej i nie są dotknięte zmianami na górze wykresu.
BŁĘDY na bok: to dziwne, że temat drzew dominujących jest "własnością" kompilatorów i nie ma o tym wzmianki w książkach o klasycznej teorii grafów. Aplikacja, dla której go używam - mój analizator sterty java FindRoots - nie jest związana z teorią kompilatora.
Wyjaśnienie: Mówię tu o ukierunkowanych wykresach. "Korzeń", o którym mówię, jest faktycznie węzłem o największej osiągalności. Zaktualizowałem powyższy tekst, zastępując odniesienia do "drzewa" za pomocą "wykresu". Mam tendencję do myślenia o nich jako o drzewach, ponieważ ich kształt jest bardzo podobny do drzewa. Wykres jest faktycznie obiektami w stosie java i jak można sobie wyobrazić, jest rozsądnie hierarchiczny. Znalazłem drzewo dominujące przydatne przy analizie przecieków OOM, ponieważ to, co cię interesuje, to "co utrzymuje ten przedmiot przy życiu?" a odpowiedź ostatecznie jest jego dominatorem. Drzewa Dominatora pozwalają ci zobaczyć drzewa, a nie drzewa. Ale czasami mnóstwo śmieci unosi się na szczycie drzewa, więc masz korzeń z tysiącami dzieci bezpośrednio pod nim. W takich przypadkach chciałbym poeksperymentować z obliczaniem drzew dominujących zakorzenionych w każdym z bezpośrednich dzieci (na oryginalnym wykresie) z korzenia, a następnie może przejść do następnego poziomu w dół i tak dalej. (Próbuję nie martwić się o możliwość odsyłaczy wstecznych :)
Tak, to może pomóc, dzięki. Martwię się o drugą część algorytmu, która normalnie zajmuje ten sam porządek czasu co dfs, ale czasami jest gorsza (i dlatego zdecydowanie potrzebujesz kompresji ścieżki). –