Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa rekurzivnim razmisljanjem

[es] :: Java :: Problem sa rekurzivnim razmisljanjem

[ Pregleda: 3141 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

m.stojanov
Test Test

Član broj: 126777
Poruke: 231
*.adsl.verat.net.



+3 Profil

icon Problem sa rekurzivnim razmisljanjem30.07.2011. u 01:32 - pre 155 meseci
Pozdrav svima.

Ovih dana sam malo vise poceo da se bavim strukturama podataka i algoritmima i prilikom resavanja raznih problema u binarnim stablima, susreo sam se vise nego ikada sa rekurzijom.

U potpunosti razumem kako rekurzija radi kad je neko drugi napise, ali je moj problem sto ne znam da razmisljam rekurzivno, tj. ne znam kako da pocetni problem svedem na base case. Jasno mi je da treba da napisem uslov za iskakanje iz rekurzije, ali kada razmisljam o trenutku kada ce metoda izaci iz sebe same i poceti da se vraca korak po korak unazad, sve do prvog poziva, zablokiram i onda ne znam sta treba da se radi, ukoliko razumete.

Zato sam hteo da vidim kako se vi nosite sa tim problemom i kako uopste razmisljate kada treba da resite problem rekurzijom. Verovatno postoji neki nacin da se to fino sagleda, da se malo sablonizuje postupak pisanja rekurzivnih metoda, makar u pocetku dok ne uvezbam...pa me interesuje kako. Trazio sam svuda po netu, ali se svuda pise o objasnjenju rekurzije, a to sam shvatio.

Evo i jednog primera...

Citat:
Napisati metodu koja vraca visinu najnizeg lista (sa najmanjom razdaljinom
* od korena)
* Dat je pokazivac na koren binarnog stabla


P.S. Ne treba mi pojasnjenje koda - jasno mi je u potpunosti. Samo se pitam kako doci do ideje da se ovako nesto napise.

Code:


public int najvisiList(Node root) {                                
        
        if(root == null) return Integer.MAX_VALUE;                 
        if(root.d == null && root.l == null) return 1;                 
        return 1 + Math.min(najvisiList(root.l),                  
        najvisiList(root.d));                     
}


 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Problem sa rekurzivnim razmisljanjem30.07.2011. u 01:41 - pre 155 meseci
Ne posmatraj odozdo, već odozgo.

Izračunamo rastojanje podstabla po levoj grani i po desnoj grani. Najkraće je minimum ta dva plus jedan (trenutno). Ako nema ni leve ni desne grane, rastojanje je 0.

Code (java):

public int najniziList(Node root) {                              

  if(root.d == null && root.l == null) {
    return 0;
  }

  int najniziLevo = najniziList(root.l);
  int najniziDesno = najniziList(root.d);

  return Math.min(najniziLevo, najniziDesno) + 1;
}
 

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Problem sa rekurzivnim razmisljanjem30.07.2011. u 03:12 - pre 155 meseci
Pa, ako znas sta je rekurzija (btw za one koji ne znaju: kucaj na googlu "recursion" pa klikni na "did you mean: recursion" :) - to je jedan od googleovih easter egg-ova) onda ti dodje nekako prirodno da znas kad treba da je upotrebis..

Recimo, taj pomenuti zadatak bih odmah krenuo da radim pomocu rekurzije, jer ne znam koliko duboko stablo moze da bude. Naravno, rekurzija moze da se izbegne ali kao sto rekoh u tim slucajevima je rekurzija "prirodno" resenje koje se prosto samo namece.

Evo kako bih ja razmisljao da sam dobio taj zadatak:

1. zamislim (nacrtam ako treba) to binarno stablo:
Code:


                                +---+
1                               |   |
                                +-+-+
                                  |
                    +-------------+-------------+
                    |                           |
                  +-+-+                       +-+-+
2                 |   |                       |   |
                  +-+-+                       +-+-+
                    |                           |
           +--------+--------+                  +--------+
           |                 |                           |
         +-+-+             +-+-+                       +-+-+
3        | * |             |   |                       |   |
         +---+             +-+-+                       +-+-+
                             |                           |
                             +--------+         +--------+
                                      |         |
                                    +-+-+     +-+-+
4                                   | * |     | * |
                                    +---+     +---+


* Koristim [code][/code] tagove da bi se drvo lepo "iscrtalo". Brojevima su oznaceni nivoi (dubina) stabla, zvezdicama (*) su oznaceni listovi.

2. u zadatku se trazi "visina najnizeg lista (sa najmanjom razdaljinom od korena)" (ja sam navikao da tu "visinu" nazivam "dubinom", ali je to svejedno), ako pogledamo "sliku" to je list na trecem nivou (ovaj skroz levo). Zasto? Pa zato sto je on najblizi korenu od sva tri lista. Razdaljinu nekog cvora (list je isto cvor, samo bez dece) dobijemo tako sto brojimo cvorove krecuci se uz stablo sve do korena:

Uzmimo da su nam ova tri lista oznacena sa A, B i C (gledajuci sliku, sa leva na desno), krenemo redom:
- A = 1 (A je list na 3. nivou)
- "pogledamo" iznad u hijerarhiji da li postoji parent cvor, postoji, uvecamo A za 1, A je sada 2
- sada pogledamo da li taj parent node ima svog parenta, ima, uvecamo A za 1, A je sada 3
- sada opet pogledamo da li taj poslednji element koji smo gledali ima parenta, nema. Znaci stigli smo do korena stabla, pamtimo da je A = 3

- istim postupkom dobijamo B = 4 i da je isto tako C = 4 (na istom su nivou)

Posto je A manji i od B i od C dolazimo do zakljucka da je A onaj list koji se trazi u zadatku (zapravo, trazi se samo na kojoj dubini se on nalazi, ne sam list, tj vrednost koju sadrzi..)

3. Dakle, sada samo ovaj postupak kojim smo "peske" dosli do resenja treba da uoblicimo u algoritam. Kljucna stvar u postupku je da smo krenuli od listova, ne od korena (odozdo, ne odozgo), to je poenta rekurzije, razmisljas odozdo na gore, spolja ka unutra. Dalje, u zadatku pise da dobijamo referencu na koren drveta, sto znaci da moramo prvo da dodjemo od korena do svih listova pa onda da vratimo dubinu najblizeg.

Ako zamislimo sledece situacije:

Code:


                
1               
                                
                                
====================================== (a)

                +---+
1               |   |
                +---+
                                
====================================== (b)

                +-+-+
1               |   |
                +-+-+
                  |
         +--------+
         |               
       +-+-+             
2      |   |             
       +---+             

====================================== (c)

                +-+-+
1               |   |
                +-+-+
                  |
         +--------+--------+
         |                 |
       +-+-+             +-+-+
2      |   |             |   |
       +---+             +-+-+ 

====================================== (d)                                


Vidimo da drvo moze da bude prazno (a) odnosno da je root == null, zatim, drvo moze da ima samo koren (b), ili samo jedno dete (c) ili oba deteta (d). Ova cetiri slucaja su dovoljna, jer ako bilo koji cvor u stablu posmatramo kao koren (mozemo da kazemo da je to koren podstabla) primeticemo da (b), (c) i (d) slucajevi vaze i kod tog cvora.
Sad imamo sve potrebne informacije da napisemo rekurzivni algoritam (znaci poenta je da se nadje najmanji skup svojstava koji vazi za svaki clan strukture kroz koju cemo se prosetati rekurzijom).

1. korak:
Code (java):

public int najvisiList(Node root) {                                  

  if (root == null) return 0;   // slucaj pod (a)                

}
 


2. korak:
Code (java):

public int najvisiList(Node root) {                                  

  if (root == null) return 0;   // slucaj pod (a)                

  if (root.l == null && root.d == null) return 1; // slucaj pod (b)
}
 


3. korak:
Code (java):

public int najvisiList(Node root) {                                  

  if (root == null) return 0;   // slucaj pod (a)                

  if (root.l == null && root.d == null) return 1; // slucaj pod (b)

  // slucaj pod (c)
  if (root.l != null && root.d == null) {  // imamo samo levo dete
      return 1 + najvisiList(root.l);   // dodajemo 1 da bi uracunali i nivo na kome se nalazi trenutni cvor koji posmatramo
  }
  if (root.l == null && root.d != null) { // imamo samo desno dete
      return 1 + najvisiList(root.d);
  }
}
 


4. korak:
Code (java):

public int najvisiList(Node root) {                                  

  if (root == null) return 0;   // slucaj pod (a)                

  if (root.l == null && root.d == null) return 1; // slucaj pod (b)

  // slucaj pod (c)
  if (root.l != null && root.d == null) {  // imamo samo levo dete
      return 1 + najvisiList(root.l);   // dodajemo 1 da bi uracunali i nivo na kome se nalazi trenutni cvor koji posmatramo
  }
  if (root.l == null && root.d != null) { // imamo samo desno dete
      return 1 + najvisiList(root.d);
  }

  // slucaj pod (d)
  int l = najvisiList(root.l); // uzimamo dubinu najblizeg lista u podstablu sa korenom u root.l
  int r = najvisiList(root.d); // uzimamo dubinu najblizeg lista u podstablu sa korenom u root.d
  return 1 + Math.min(l, r); // uzimamo najvisi list od dva dobijena i vracamo njegovu dubinu uvecanu za 1
}
 


I to je to, ovaj kod radi ono sto treba. Ali mozemo da objedinimo 3. i 4. korak i da tako optimizujemo trenutni kod. Ako pogledamo kod za slucaj (d) vidimo da on vraca manji od levog i desnog + 1, ako dalje pogledamo kod za slucaj (a) vidimo da funkcija vraca 0 ukoliko joj prosledimo nevalidan objekat. Izgleda da mozemo da izbacimo kompletan kod za slucaj (c), dobijamo:

Code (java):

public int najvisiList(Node root) {                                  

  if (root == null) return 0;   // slucaj pod (a)                

  if (root.l == null && root.d == null) return 1; // slucaj pod (b)

  // slucaj pod (d)
  int l = najvisiList(root.l); // uzimamo dubinu najblizeg lista u podstablu sa korenom u root.l
  int r = najvisiList(root.d); // uzimamo dubinu najblizeg lista u podstablu sa korenom u root.d
  return 1 + Math.min(l, r); // uzimamo najvisi list od dva dobijena i vracamo njegovu dubinu uvecanu za 1
}
 


Ali, ovo vise nije ispravan algoritam! Ukoliko cvor ima samo jedno dete dobicemo:
Code (java):

l  = 123; // neki broj > 0, posto je root.l != null
r = 0; // root.d == null pa nam prvi if vraca nulu
return 1 + Math.Min(123, 0); // dobicemo 1 a ne 124!
 


Najjednostavnije resenje je da umesto nule vratimo neku veliku vrednost, za koju pretpostavljamo da ce biti uvek veca od dubine drveta, Integer.MAX_VALUE je sasvim pogodan broj za tu namenu, i zato cemo njega da uzmemo:
Code (java):

public int najvisiList(Node root) {                                  

  if (root == null) return Integer.MAX_VALUE;   // slucaj pod (a)                

  if (root.l == null && root.d == null) return 1; // slucaj pod (b)

  // slucaj pod (d)
  int l = najvisiList(root.l); // uzimamo dubinu najblizeg lista u podstablu sa korenom u root.l
  int r = najvisiList(root.d); // uzimamo dubinu najblizeg lista u podstablu sa korenom u root.d
  return 1 + Math.min(l, r); // uzimamo najvisi list od dva dobijena i vracamo njegovu dubinu uvecanu za 1
}
 


nakon poslednje "optimizacije" (samo skracujemo kod, ne dobijamo ni na smanjenu instrukcija ni memorije) imamo kod:
Code (java):

public int najvisiList(Node root) {                                  
  if (root == null) return Integer.MAX_VALUE;
  if (root.l == null && root.d == null) return 1;
  return 1 + Math.min(najvisiList(root.l), najvisiList(root.d));
}
 


Sto je kod koji si ti postovao.

Dakle eto kako bih ja dosao do tog algoritma, koja istina ima jedan mali nedostatak, ukoliko mu prosledimo prazno drvo (drvo koje nema cak ni koren) dobicemo Integer.MAX_VALUE (2^31 - 1) sto nije bas tacno, tacan rezultat u tom slucaju bi bio 0. Ali eto savrsenog upozorenja da se stavi u dokumentaciju funkcije! :)



edit: izmenjeni dijagrami

[Ovu poruku je menjao Aleksandar Ružičić dana 30.07.2011. u 04:33 GMT+1]
 
Odgovor na temu

Bojan Basic
Novi Sad

SuperModerator
Član broj: 6578
Poruke: 3996
*.dynamic.sbb.rs.

Jabber: bojan_basic@elitesecurity.org
ICQ: 305820253


+605 Profil

icon Re: Problem sa rekurzivnim razmisljanjem30.07.2011. u 03:41 - pre 155 meseci
Citat:
Aleksandar Ružičić:
Dakle eto kako bih ja dosao do tog algoritma, koja istina ima jedan mali nedostatak, ukoliko mu prosledimo prazno drvo (drvo koje nema cak ni koren) dobicemo Integer.MAX_VALUE (2^31 - 1) sto nije bas tacno, tacan rezultat u tom slucaju bi bio 0.

Ne baš. U ovom zadatku tražimo minimum nekog skupa. Minimum je specijalan slučaj infimuma (kada infimum pripada skupu). Dakle, ako na početku raspolažemo praznim skupom, onda minimum nema smisla tražiti, te nas jedino može spasti posmatranje opštije verzije minimuma, infimuma. U proširenom skupu realnih brojeva, , infimum postoji za svaki skup.

Infimum je najveće donje ograničenje nekog skupa. Dakle, važi (u prevodu: je infimum skupa ako i samo ako je, za sve , manje od ili jednako sa — tj., je donje ograničenje skupa — i svako drugo donje ograničenje mora biti manje od ili jednako sa ). E, kad ovako postavimo stvari, dalje se pravolinijski sagledava:

Drugim rečima, infimum praznog skupa zapravo je (a nikako nije ). Pošto se programski jezici slabo snalaze s beskonačnošću, aproksimiramo je najvećim brojem s kojim su u stanju da rade.
Ljubičice crvena, što si plava kô zelena trava.
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Problem sa rekurzivnim razmisljanjem30.07.2011. u 12:28 - pre 155 meseci
Ja sam svojevremeno na jednom konkursu za posao (doduše bio je php u pitanju al nema veze princip je isti) dobio zadatak da na Html stranici iscrtam sve direktorijume i fajlove u korenom direktorijumu veb servera. Uradio sam to preko rekurzije. Nisam siguran ali tad nisam video drugačiji način da tako nešto uradim. Probaj i sam da rešiš taj problem, mislim da on odlično opisuje princip rekurzije.
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Problem sa rekurzivnim razmisljanjem30.07.2011. u 16:29 - pre 155 meseci
Bojane, da razmatramo problem samo u okviru matematike slozio bih se sa tobom da 0 ne bi trebalo da bude resenje, mada priznajem da ne bih znao da navedem taj matematicki dokaz. :)

Ali posto je u pitanju programiranje, dakle inzenjerstvo a ne matematika, moramo da radimo u okviru onoga cime raspolazemo. U ovom slucaju u pitanju je Integer tip, koji za razliku od Float nema specijalnu vrednost Infinity, iz tog razloga je npr Integer i inicijalizovan na 0 a Float na NaN (jos jedna specijalna vrednost, doduse nisam siguran kako je u Javi po ovom pitanju, ispravice me neko ako gresim, ali tako je u npr D-u, sto je skroz razumno), prema tome moramo da uzmemo da je resenje u tom slucaju 0. I to je inzenjerski skroz prihvatljivo. Posto smo mi morali da iskoristimo neki veliki broj (najveci iz opsega u kome radimo) u tom slucaju to mora da se navede u dokumentaciji funkcije i time smo uveli specificnu vrednost za rezultat te funkcije.
Istina, posto java podrzava izuzetke mogli smo i njih da iskoristimo ali bi nam to malo iskomplikovalo logiku..
 
Odgovor na temu

m.stojanov
Test Test

Član broj: 126777
Poruke: 231
*.adsl.verat.net.



+3 Profil

icon Re: Problem sa rekurzivnim razmisljanjem30.07.2011. u 20:41 - pre 155 meseci
Hvala vam ljudi na odgovorima. :)

Aleksandre, tvoj post je zaista sjajan. ;-)

Vidim da Goran ima jedan nacin gledanja na rekurziju (kaze da gledam odozgo), Aleksandar kaze odozdo (tako i ja radim). U sustini, izgleda ne postoji univerzalni patern za resavanje (sto je meni i trebalo) i shvatam da treba vremena i jos malo rada da se unormali ta apstrakcija koja mi se javlja prilikom rekurzivnog razmisljanja i to je to.
 
Odgovor na temu

Bojan Basic
Novi Sad

SuperModerator
Član broj: 6578
Poruke: 3996
*.dynamic.sbb.rs.

Jabber: bojan_basic@elitesecurity.org
ICQ: 305820253


+605 Profil

icon Re: Problem sa rekurzivnim razmisljanjem30.07.2011. u 22:50 - pre 155 meseci
Citat:
Aleksandar Ružičić:
Ali posto je u pitanju programiranje, dakle inzenjerstvo a ne matematika, moramo da radimo u okviru onoga cime raspolazemo. U ovom slucaju u pitanju je Integer tip, koji za razliku od Float nema specijalnu vrednost Infinity, iz tog razloga je npr Integer i inicijalizovan na 0

Naravno da moramo raditi u okviru onoga čime raspolažemo, i time se pomiriti s izvesnim aproksimacijama. Upravo to sam rekao u poslednjoj rečenici moje prethodne poruke, ne znam jesi li obratio pažnju. Dakle, vrednost koja bi matematički trebalo da bude jednaka ne može biti predstavljena u tipu Integer, pa onda postupamo tako što uzimamo najbolju aproksimaciju. Šta je „najbliže beskonačnosti“ u tipu Integer? Pa sigurno najveći broj do kog možemo stići, a ni u kom slučaju nije nula. (Ti pominješ da je je promenljiva tipa Integer inicijalizovana na 0 — ali inicijalizacija nema baš nikakve veze s ovim. Ovde nije reč o inicijalnom iznosu neke promenljive, nego o rezultatu koji toj promenljivoj treba da bude dodeljen nakon izračunavanja vrednosti .)

Zašto za treba uzeti baš aproksimaciju Integer.MAX_VALUE, i zašto nam nula nikako ne bi odgovarala, lepo se vidi i upravo iz koda o kom je reč na ovoj temi, i iz tvog objašnjenja dotičnog koda. Tvoje objašnjenje je vrlo lepo i sistematično napisano, i zaista svaka čast na tome, ali poslednji pasus je potpuno pogrešan.

Ako i dalje nije dovoljno jasno zašto tvoja interpretacija nije dobra, evo još jednog primera. Svakako ćeš se složiti da za svaka dva skupa i za koje važi mora važiti . I sad, evo, neka je i (primeti da su ovde sve vrednosti tipa Integer!) Prema tvojoj interpretaciji, važilo bi i , ali ne važi , šta ćemo sad? Ukoliko pak stavimo da je , za šta ja tvrdim da je ispravno, tada zaista važi (i ne samo to, odgovarajući odnos će važiti sve dok su vrednosti iz skupa tipa Integer). Da li se sad razumemo?
Ljubičice crvena, što si plava kô zelena trava.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12850



+4784 Profil

icon Re: Problem sa rekurzivnim razmisljanjem31.07.2011. u 00:34 - pre 155 meseci
Citat:
biske86: Ja sam svojevremeno na jednom konkursu za posao (doduše bio je php u pitanju al nema veze princip je isti) dobio zadatak da na Html stranici iscrtam sve direktorijume i fajlove u korenom direktorijumu veb servera. Uradio sam to preko rekurzije. Nisam siguran ali tad nisam video drugačiji način da tako nešto uradim. Probaj i sam da rešiš taj problem, mislim da on odlično opisuje princip rekurzije.

Drugi nacin je preko petlje ali je u vecini slucajeva rekurzija prakticnija. Ne bi funkcionisala jedino ako je dubina direktorijuma tolika da se prepuni stek.
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Problem sa rekurzivnim razmisljanjem31.07.2011. u 00:45 - pre 155 meseci
Izvinite što skrećem sa teme, ali me interesuje kako bi moglo preko petlje. Na koju petlju si mislio?
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Problem sa rekurzivnim razmisljanjem31.07.2011. u 01:01 - pre 155 meseci
Code:

result = []
queue  = ['/home/test']

while not empty queue
    path = pop queue
    dirs, files = list path
    result += files    
    queue  += dirs

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Problem sa rekurzivnim razmisljanjem31.07.2011. u 01:49 - pre 155 meseci
Citat:
Bojan Basic: Naravno da moramo raditi u okviru onoga čime raspolažemo, i time se pomiriti s izvesnim aproksimacijama. Upravo to sam rekao u poslednjoj rečenici moje prethodne poruke, ne znam jesi li obratio pažnju.

Nisam dobro procitao tvoju predhodnu poruku pa mi je promakla ta poslednja recenica, izvini..

Slazem se ja u potpunosti da je MAX_VALUE (najveca vrednost kojom mozemo da raspolazemo) bliza beskonacnosti od nule, ali ja ovaj zadatak nisam posmatrao kao trazenje minimuma nekog skupa (ne kazem da nije to u pitanju) vec kao trazenje dubine na kojoj se nalazi cvor u stablu. Pa mi je u tom slucaju 0 sasvim prihvatljiva (ako nema nijednog cvora u stablu i znam da ce funkcija u tom slucaju da vrati 0 mogu slobodno da koristim depth >= 3 npr ako hocu da proverim da se list nalazi na trecem ili dubljem nivou) kao ispravno resenje kada cvor nije moguce pronaci (kada nema ni jednog cvora u stablu). Znam da ovo moje razmisljanje nije matemaciki ispravno ali nisam matematicar i pokusavam da posmatram dati problem onako kako bi ga inzenjer posmatrao. Ne kazem da sam inzenjer, ali sam blize tom zvanju nego matematicaru :)

U svakom slucaju, tvoj stav je potpuno ispravan i tacan gledano sa matematicke strane, dok je moj prihvatljiviji gledano iz moje perspektive :)
Ne bih voleo da nastavimo dalje o ovome (jer tema nije bas o tome), prihvatam zamerku da sam u poslednjem pasusu prve poruke na ovoj temi izneo matematicki neispravnu tvrdnju, ali necu reci da sam pogresio :)

Inace, ja bih ovaj kod u pitanju sigurno napisao tako da vrati 0 a ne MAX_VALUE, ali to sam samo ja..
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12850



+4784 Profil

icon Re: Problem sa rekurzivnim razmisljanjem31.07.2011. u 03:06 - pre 155 meseci
Citat:
Aleksandar Ružičić: vec kao trazenje dubine na kojoj se nalazi cvor u stablu.

To (vracanje nule) bi znacilo da je cvor zapravo root stabla. Iz neke prakse, pre bi trebalo -1.
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Problem sa rekurzivnim razmisljanjem31.07.2011. u 11:49 - pre 155 meseci
Pa to, 1 manje od dubine na kojoj se nalazi root, ako je pocetna dubina 0 onda -1, ako je 1 onda 0..
 
Odgovor na temu

Bojan Basic
Novi Sad

SuperModerator
Član broj: 6578
Poruke: 3996
*.dynamic.sbb.rs.

Jabber: bojan_basic@elitesecurity.org
ICQ: 305820253


+605 Profil

icon Re: Problem sa rekurzivnim razmisljanjem02.08.2011. u 04:55 - pre 154 meseci
Citat:
Aleksandar Ružičić:
...ali ja ovaj zadatak nisam posmatrao kao trazenje minimuma nekog skupa (ne kazem da nije to u pitanju) vec kao trazenje dubine na kojoj se nalazi cvor u stablu.

Mi kao da ne čitamo isti zadatak. Dubinu kog čvora tražiš? Koliko ja vidim, traži se dubina lista s najmanjom razdaljinom od korena. Znači, uzmeš skup svih listova, pa među njihovim dubinama tebi treba minimum. Ako nemaš nijedan list, onda tražiš minimum praznog skupa. Kakvu crnu dubinu čvora bi ti tražio ako nemaš uopšte čvorova u stablu?
Citat:
Aleksandar Ružičić:
Znam da ovo moje razmisljanje nije matemaciki ispravno ali nisam matematicar i pokusavam da posmatram dati problem onako kako bi ga inzenjer posmatrao. Ne kazem da sam inzenjer, ali sam blize tom zvanju nego matematicaru :)

U prošloj poruci dao sam ti u potpunosti inženjerski primer: dva skupa, jedan je prazan, drugi sadrži samo brojeve 5, 10, 15 — i objasnio sam zašto tvoj pristup pada i na ovom inženjerskom primeru. Dakle, ovakav pristup nije ispravan ni matematički, ni inženjerski (ni s bilo koje treće tačke gledišta).
Citat:
Aleksandar Ružičić:
Ne bih voleo da nastavimo dalje o ovome (jer tema nije bas o tome), prihvatam zamerku da sam u poslednjem pasusu prve poruke na ovoj temi izneo matematicki neispravnu tvrdnju, ali necu reci da sam pogresio :)

To je već druga stvar. Meni nije stalo da ti izjaviš da si pogrešio ili šta već, baš me briga. Primetio sam grešku u tvom rezonovanju i hteo da skrenem pažnju na nju kako drugim članovima foruma (da ne bi tako pogrešno prihvatili), tako i tebi (da ne bi ubuduće ponavljao slične greške). Ako ti nisi zainteresovan za korigovanje svojih grešaka, onda je to prosto trebalo da kažeš još na početku, pa bi uštedeo vremena i sebi i meni.

Rekao sam šta sam imao, sve sam obrazložio najbolje što sam mogao — ko hoće da shvati, shvatiće, a ko neće, ne mora. Isključujem se s teme.
Ljubičice crvena, što si plava kô zelena trava.
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Problem sa rekurzivnim razmisljanjem02.08.2011. u 13:27 - pre 154 meseci
Nije da ja ne zelim da ispravljam svoje greske, naravno da uvek nastojim da usavrsim svoje znanje. Kao sto sam rekao, prihvatam tvoju zamerku da nisam rezonovao po matematickim pravilima a prihvatam i da "inzenjerski gledano" sa neke strane nisam bio u pravu.

Ali godine programiranja su mi usadile sledece razmisljanje: ukoliko trazis poziciju nekog elementa u skupu, i ukoliko ga ne nadjes (bilo da nema trazenog elementa bilo da je skup prazan) vrati poziciju prvog elementa umanjenu za 1 (tako da to bude nevalidna pozicija nekog elementa u tom skupu).

Uzmimo na primer funkcije za trazenje stringa ili karaktera u stringu. Evo recimo u raznim Basic-ima karakteri u stringu su indeksirani od jedinice (prvi karakter ima index 1) i prema tome InStr funkcija ce da vrati 0 ukoliko je string u kome se trazi prazan (prazan skup) ili to sto se trazi (karakter/podstring) ne postoji u datom stringu (skupu). Sa druge strane, u C-olikim jezicima stringovi su indeksirani od nule (prvi karakter ima indeks 0) i funkcije koje traze poziciju karaktera/stringa u stringu (uzmimo npr indexOf u D-u) ce vratiti -1 ukoliko trazeni karakter/string ne postoji ili je string u kome se trazi prazan.

Naveo sam bas trazenje stringova jer i to moze da se posmatra kao trazenje minimuma jer se trazi prvi karakter (sa najmanjim indeksom, najblizi pocetku stringa), razlika u odnosu na drvo je samo sto je kod stringova pretraga linearna (jer je string u osnovi niz).

I ja sam prihvatio tu logiku i nastavio da je koristim u svojim algoritmima koji traze element(e) u odredjenom skupu, nije to nesto sto sam ja izmislio i ustalio. Ali sam prihvatio jer sam uvideo da to pruza dosta olaksica u koriscenju tog algoritma za pretragu.
Kao sto rekoh, nije mozda teorijski ispravno ali se itekako pokazalo korisnim u praksi i koristi se decenijama...
 
Odgovor na temu

[es] :: Java :: Problem sa rekurzivnim razmisljanjem

[ Pregleda: 3141 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.