Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 190 Pomógł: 1 Dołączył: 20.05.2005 Skąd: Poznań Ostrzeżenie: (0%)
|
Witam!
Zalozmy, ze mamy w tabeli bazy danych proste drzewko. Kazdy wiersz ma 3 pola: id, parent_id i name. Odczytalismy te rekordy z bazy, mamy je w dwuwymiarowej tablicy asocjacyjnej i chcemy wyswietlic w formie drzewka: Kod level1_1 level2_1 level3_1 level3_2 level3_3 level2_2 level2_3 level1_2 level2_4 level1_3 Drzewko moze miec dowolna ilosc poziomow zaglebienia. Jesli sie uzywa rekurencji to proste. Ale czy da sie to zrobic iteracyjnie? A jesli sie da, to jak? Zakladam, ze jesli sie da, to bedzie wydajniej. Czy sie nie myle? Ten post edytował marcini82 13.09.2007, 12:37:51 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 418 Pomógł: 8 Dołączył: 16.11.2006 Ostrzeżenie: (0%)
|
Poszukaj na forum - kilka takich tematów już było.
A co do przewagi iteracji nad rekurencją - pętle są szybsze, to prawda. Wogóle nie wiem czy wiecie, ale każdą rekurencję można przerobić na iterację. W prawdzie, wstyd się przyznać, nie wiem dokładnie jak, ale podobno można... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 174 Pomógł: 0 Dołączył: 27.03.2007 Skąd: Osiek almost City ;-D Ostrzeżenie: (0%)
|
Wogóle nie wiem czy wiecie, ale każdą rekurencję można przerobić na iterację. W prawdzie, wstyd się przyznać, nie wiem dokładnie jak, ale podobno można... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Czasem wystarczą odpowiednie pętle, czasem należy użyć już stosów. Wolę to pierwsze rozwiązanie, o ile się da (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif) To drugie jest trochę skomplikowane. |
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 1 657 Pomógł: 125 Dołączył: 29.04.2006 Ostrzeżenie: (0%)
|
spójrz na mój opis: Generator LZT (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Możesz go dowolnie zmodyfikować, bo nie będzie w 100% wyświetlał tak, jak chcesz (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Z tym że to jest sposób rekurencyjny.
Ten post edytował radex_p 15.09.2007, 17:13:22 |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 190 Pomógł: 1 Dołączył: 20.05.2005 Skąd: Poznań Ostrzeżenie: (0%)
|
Rekurencyjnie to umiem - zaden problem.
Ale chcialbym sobie cos takiego zrobic bez rekurencji i porownac wydajnosc. Jak moge obsluzyc te nieograniczona ilosc poziomow zaglebienia? Moze byscie mogli rzucic jakimis przykladami? Cokolwiek, co by mi pozwolilo zalapac idee tego podejscia? @pbnan Piszesz o stosach. A moglbys dac jakis przyklad ich wykorzystania w podobnym problemie? |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 17.09.2007 Ostrzeżenie: (0%)
|
Istnieje podejście, choć oczywiście o innej strukturze danych niż opisana przez Ciebie. Ale rzeczywiście zwieksza wydajnosc:
wygugluj sobie 'celko tree'. |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 174 Pomógł: 0 Dołączył: 27.03.2007 Skąd: Osiek almost City ;-D Ostrzeżenie: (0%)
|
@pbnan Piszesz o stosach. A moglbys dac jakis przyklad ich wykorzystania w podobnym problemie? Mam to w książce "Algorytmy i struktury danych" wyd. Helion. Niestety, trudny temat, jak na początek odpuściłem sobie go i wiele powiedzieć nie mogę. Natomiast wygóglować można ciekawe informacje. Np. tutaj [cache gógla] masz coś o tym: http://209.85.135.104/search?q=cache:SWFf8...t=clnk&cd=6 |
|
|
|
Post
#8
|
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%)
|
Cytat Odczytalismy te rekordy z bazy, mamy je w dwuwymiarowej tablicy asocjacyjnej i chcemy wyswietlic w formie drzewka: Pokaz ta tablice bo nie potrafie sobie jej wyobrazic, i jak jest posortowana. Co do rekurencji - ograniczona jest wielkoscia stosu == glebokosci drzewka |
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 190 Pomógł: 1 Dołączył: 20.05.2005 Skąd: Poznań Ostrzeżenie: (0%)
|
Cytat Pokaz ta tablice bo nie potrafie sobie jej wyobrazic, i jak jest posortowana. Przedstawia po prostu kolejne rekordy w bazie danych przy takim modelu drzewka: Kod Array ( [0] => Array ( [id] => 2 [name] => level1_1 [parent_id] => 1 ) [1] => Array ( [id] => 3 [name] => level1_2 [parent_id] => 1 ) [2] => Array ( [id] => 4 [name] => level1_3 [parent_id] => 1 ) [3] => Array ( [id] => 5 [name] => level2_1 [parent_id] => 2 ) [4] => Array ( [id] => 6 [name] => level2_2 [parent_id] => 2 ) [5] => Array ( [id] => 7 [name] => level2_3 [parent_id] => 2 ) ) Cytat Istnieje podejście, choć oczywiście o innej strukturze danych niż opisana przez Ciebie. Ale rzeczywiście zwieksza wydajnosc: wygugluj sobie 'celko tree'. Chodzi ci o "nested sets"? Tez ciekawy temat, ogolnie drzewka to dosc obszerna i zawila sprawa, bo kazde podejscie ma plusy i minusy... Ale w tej chwili zalezy mi glownie na wyrzuceniu rekurencji z tego konkretnego modelu drzewka. Cytat Mam to w książce "Algorytmy i struktury danych" wyd. Helion. Niestety, trudny temat, jak na początek odpuściłem sobie go i wiele powiedzieć nie mogę. Natomiast wygóglować można ciekawe informacje. Poszukam troche i poczytam, ale dzis juz o tej porze to troche za ciezkie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Musze poczekac na dobry dzien. |
|
|
|
Post
#10
|
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%)
|
marcini82: najpierw myslalem ze chodzi ci o rekurencje w samym php, a nie przy pobieraniu parentow z bazy, tak?
Co to robi? Przerabia rekordy na drzewko Node'ow i drukuje je. Zachowuje kolejnosc rekordow z bazy, tzn jesli 1_2 bylo przed 1_1 to tak zostana wyswietlone Niestety jest rekurencja (bo nie chcialo mi sie rozpisywac) O takie cos chodzilo? Zeby pozbyc sie tej rekurencji trzeba zasymulowac zachowanie stosu przy korzystaniu z rekurencji. Chyba zaraz to napisze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) printMe // rekurencja printMeWithUseOfIterations // iteracja, pewnie da sie przyspieszyc, ale juz mi sie nie chce (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Wyszlo mi dla glebokiego drzewka : define( 'DEPTH', 10000); define( 'REPEAT', 100000); printMe: 0.088973999023438 printMeWithUseOfIterations: 0.26687598228455 rekurencja rzadzi ? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) dla "szerokiego" define( 'REPEAT', 100000); printMe: 3.2444250583649 printMeWithUseOfIterations: 3.3689439296722 bez roznicy |
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 190 Pomógł: 1 Dołączył: 20.05.2005 Skąd: Poznań Ostrzeżenie: (0%)
|
Oczywiscie chodzilo o rekurencje w samym php. Przy wysylaniu zapytan to bylaby przesada (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Musze przyznac, ze odwaliles kawal dobrej roboty z tym przykladem. Chociaz obszernosc tego kodu nieco utrudnia dotarcie do samego sposobu eliminacji rekurencji... Musze to dokladniej przeanalizowac. Zdziwily mnie te wyniki. Co prawda rekurencja w php to troche co innego niz w jezykach nizszego poziomu, ale mimo wszystko spodziewalem sie jednak spadku wydajnosci. Zrobilem jeszcze taki tescik:
Wyglada na to, ze php wyklada sie jesli ilosc wywolan rekurencyjnych przekracza 1400-1500. W sumie to dosc duzo. Daloby sie spore drzewo wyrysowac (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
|
![]() ![]() |
|
Aktualny czas: 23.12.2025 - 21:29 |