Dekartovo drvo | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Tip | Randomizovano stablo binarne pretrage | ||||||||||||||||||||
Vremenska kompleksnost u velikoj O notaciji | |||||||||||||||||||||
|
U kompjuterskoj nauci, Dekartovo drvo (Dekartovo stablo, treap) i binarno pretraživačko drvo na slučajan način su dve usko povezane forme binarnog pretraživačkog drveta kao strukture podataka koja održava dinamički skup uređenih ključeva i omogućava binarno pretraživanje među ključevima. Nakon svakog umetanja ili brisanja ključa, oblik drveta je nasumično promenljiv sa istom raspodelom verovatnoće kao kod slučanog binarnog stabla; a naročito je velika verovatnoća da je njegova visina proporcionalna logaritmu broja ključeva, tako da je vremenska složenost operacija pretraživanja, umetanja ili brisanja jednaka logaritamskoj.
Dekartovo drvo su prvi put opisali Cecilija Aragon i Rejmond Sidel 1989. godine.[1][2] To je Kartezijansko stablo[3] u kojem je svakom ključu dat (nasumično izabran) brojčani prioritet. Kao i kod svih binarno pretračivackih stabala, redosled obilaska čvorova je isti kao i sortirani poredak ključeva. Struktura stabla je određena zahtevom da ono ima uređen hip: tj. prioritetni broj za bilo kojeg čvora koji nije list mora biti veći ili jednak prioritetnim brojevima njegovih potomaka. Stoga, kao što je to generalno slučaj kod Kartezijanskih stabala, korenski čvor ima maksimalni prioritet, a njeno levo i desno potstablo se formiraju na isti način iz podsekvenci sa sortiranim redosledom levo i desno od tog čvora.
Ekvivalentan način opisivanja Dekartovog drveta je da ono može biti formirano umetanjem čvorova sledeći opadajući redosled prioriteta u binarno pretraživačko drvo bez ikakvog uravnotežavanja. Dakle, ukoliko su prioriteti nezavisni slučajni brojevi (iz distribucije dovoljno velikog prostora mogućih prioriteta kako bi se osiguralo da je veoma mala verovatnoća da dva čvora imaju isti prioritet) onda je Dekartovo stablo ima istu distribuciju verovatnoće kao i randomno binarno stablo, što je pretraživačko stablo formirano umetanjem čvorova bez uravnotežavanja u slučajno randomno izabranom redosledu umetanja. Pošto je za randomno binarno pretraživačko drvo poznato da ima ima logaritamsku visinu sa visokom verovatnoćom, isto važi i za Dekartova stabla.
Aragon i Seidel takođe sugerišu na dodeljivanje većih prioriteta na češće pristupne čvorove, na primer procesom koji, na svakom pristupu stablu, izabere slučajan broj pa zameni prioritet čvora tim brojem, ako mu je prioritet veći od prethodnog. Ova modifikacija bi izazvala da stablo izgubi svoj nasumični oblik; umesto toga, češće pristupani čvorovi će verovatno biti blizu korena stabla, izazivajući da njhovo pretraživanje bude brže.
Blelloch i Reid-Miller[4] opisuju aplikaciju Dekartovog drveta za probleme održavanja skupa stavki i obavljanje operacija skupa unije, skupa preseka, i skupa razlike, korišćenjem Dekartovog drveta za prikaz svakog skupa. Naor and Nissim[5] opisuju primenu u održavanju autorizacije certifikata u kriptosistemima s javnim ključem.
Konkretno, Dekartovo stablo podržava sledeće operacije:
Binarno pretraživačko drvo na slučajan način, predstavljeno od strane Martíneza i Roura odmah nakon rada Aragona i Seidela na Dekartovim stablima,[6] skladišti iste čvorove, sa istom nasumičnom raspodelom oblika stabla, ali zadržava drugačije informacije u okviru čvorova stabla u cilju održavanja svoje sučajne strukture.
Umesto skladištenja nasumičnih prioriteta na svakom čvoru, Binarno pretraživačko drvo na slučajan način skladišti mali ceo broj u svakom čvoru, a to je broj njegovih potomaka (računajući i sebe kao jedan); ovi brojevi se mogu održavati tokom operacije rotacije stabla u sa konstantnim dodatnim vremenom za svaku operaciju rotacije. Kada treba da ubacimo ključ X u stablo koje već sadrži n čvorova, algoritam umetanja bira sa verovatnćom 1/(n + 1) da postavi X kao nov koren stabla, a inače se poziva postupak za umetanje rekurzivno u levo ili desno podstablo (u zavisnosti da li je njegov ključ manji ili veći od trenutnog korena). Brojevi potomaka se koriste u algoritmu za izračunavanje potrebne verovatnoće kod slučajnog izbora u svakom koraku. Postavljanje X u koren stabla se može vršiti bilo kao kod Dekartovog stabla, stavljajući ga na list, a zatim okretanjem na gore, ili po alternativnom algoritmu koji su opisali Martínez i Roura koji deli podstablo na dva dela, koji se kasnije koriste kao levi i desni potomak novog čvora.
Postupak brisanja kod binarno pretraživačkog stabla na slučajan način koristi istu informaciju za čvorove kao i procedura umetanja, a kako on čini deo od O(log n) nasumičnih odluka kako bi se spojila dva podstabla u opadajućem poredku levog i desnog potomka izbrisanog čvora u stablu. Ako su levo i desno podstablo koje želimo da obrišemo prazni, tada je operacija spajanja trivijalna; inače je, levi ili desni potomak izbrisanog čvora izabran kao novi koren podstabla sa verovatnoćom proporcionalnoj njegovom broju potomaka, pa se operacija spajanja nastavlja rekurzivno.
Informacija koja je uskladištena u čvorovima u binarno pretraživačkom stablu na slučajan način je jednostavnija nego u Dekartovom stablu (mali ceo broj, a ne visoke preciznosti slučajnih brojeva), ali zahteva veći broj poziva generatora slučajnog broja (koji ima O(log n) poziva po operaciji umetanja ili brisanja, umesto samo jednog poziva po umetanju) i postupak ubacivanja je malo komplikovaniji zbog potrebe da se ažurira broj potomaka za svaki čvor. Manja tehnička razlika je ta što, u Dekartovom stablu, postoji mala verovatnoća sudara (da va ključa imaju isti prioritet), a u oba slučaja će biti statističke razlike između pravog generatora slučajnih brojeva i generator pseudo-slučajnih brojeva koji se obično koriste na digitalnim računarima. Međutim, u svakom slučaju je razlika između teorijskog modela savršenih slučajnih izbora koji se koriste za dizajn algoritama i mogućnosti stvarnih generatora slučajnih brojeva su zanemarljivo male.
Iako Dekartovo stablo i binarno pretraživačko stablo na slučajan način oba imaju istu nasumičnu raspodelu oblika stabla nakon svakog ažuriranja, istorija, izmena stabala koje se obavljaju kod ove dve strukture podataka nakon niza operacia umetanja ili brisanja, može biti različita. Na primer, u Dekartovom stablu, ako se tri broja 1,2 i 3 umetnu u redosledu 1,3,2, azatim se broj 2 izbriše, preostala dva čvora će imati istu roditelj-potomak odnos kao i pre umetanja srednjeg broja. U binarno pretraživačkom stablu na slučajan način, stablo nakon brisanja je pođednako verovatno da će biti jedan od dva moguća stabla na osnovu njegova dva čvora, nezavisno od toga kako je stablo izgledalo pre ubacivanja srednjeg broja.