You are on page 1of 5

Structuri de date

Arbori de

INTERVALE
Dana Lica
ca i cea utilizat n cazul heap-urilor binare.
procedura Actualizare (nod, st, dr, a, b) dac a st i dr b atunci

focus

n cadrul acestui articol vom prezenta o structur de date cunoscut sub numele de arbore de intervale (engl. segment tree), precum i o serie de aplicaii n geometria computaional.

Arbori de intervale
Un arbore de intervale este un arbore binar n care fiecare nod poate avea asociat o structur auxiliar (anumite informaii). Dndu-se dou numere ntregi st i dr, cu st < dr, atunci arborele de intervale T(st, dr) se construiete recursiv astfel: considerm rdcina nod avnd asociat intervalul [st, dr]; dac st < dr atunci, vom avea asociat subarborele stng T(st, mij), respectiv subarborele drept T(mij + 1, dr), unde mij este mijlocul intervalului [st, dr]. Intervalul [st, dr] asociat unui nod se numete interval standard. Frunzele arborelui sunt considerate intervale elementare, ele avnd lungimea 1. Un arbore de intervale este ilustrat n figura 1.

Proprietate Un arbore de intervale este un arbore binar echilibrat (diferena absolut ntre adncimea subarborelui stng i subarborelui drept este cel mult 1). Astfel adncimea unui arbore de intervale care conine N intervale este [log2 N] + 1. Vom prezenta n cele ce urmeaz operaiile specifice acestei structuri de date. Actualizarea unui interval dintr-un arbore de intervale Vom prezenta pseudocodul unei proceduri recursive cu ajutorul creia se poate insera un interval [a, b] ntr-un arbore de intervale T(st, dr) cu rdcina n nodul nod. Cea mai eficient metod de stocare n memorie a unui arbore de intervale este utilizarea unui vector folosind aceeai codificare a nodurilor

modific structura auxiliar din nodul nod


altfel mij [(st + dr) / 2] dac a mij atunci Actualizare(2 nod, st, mij, a, b) sfrit dac dac b > mij atunci Actualizare(2 nod + 1, mij + 1, dr, a, b) sfrit dac

actualizeaz structura auxiliar din nodul nod


sfrit dac sfrit procedur

Interogarea unui interval dintr-un arbore de intervale Vom prezenta n continuare pseudocodul unei funcii recursive care returneaz informaiile asociate unui interval [a, b] dintr-un arbore de intervale T(st, dr) cu rdcina n nodul nod.
funcie Interogare (nod, st, dr, a, b) dac a st i dr b atunci returneaz structura auxiliar din nodul nod altfel mij [(st + dr) / 2]

Figura 1: Arbore de intervale

35

GInfo nr. 15/4 - aprilie 2005

focus

dac a mij atunci Interogare(2 nod, st, mij, a, b) sfrit dac dac b > mij atunci Interogare(2 nod + 1, mij + 1, dr, a, b) sfrit dac returneaz structura auxiliar

cror rezolvare arborii de intervale sunt utili. Problema #1 Se consider N 50.000 segmente n plan dispuse paralel cu axele Ox i Oy. S se determine care este numrul total de intersecii ntre segmente. n fiierul segment.in se afl pe prima linie numrul N al segmentelor, iar pe fiecare dintre urmtoarele N linii se afl cte patru numere naturale mai mici dect 50.000, reprezentnd coordonatele carteziene ale extremitilor fiecrui segment. Rezultatul se va scrie n fiierul segment.out. Exemplu
segment.in 5 2 9 13 9 4 6 12 6 1 2 6 2 5 0 5 8 7 5 7 11 segment.out 4

din fiul stng i din fiul drept


sfrit dac sfrit funcie

Analiza complexitii Vom demonstra n continuare c operaiile prezentate mai sus au ordinul de complexitate O(log N) pentru un arbore de N intervale. Este posibil ca ntr-un nod s aib loc apel att pentru fiul stng ct i pentru cel drept. Acest fapt determin un cost adiional doar prima dat cnd are loc. Dup prima "rupere n dou", oricare astfel de "rupere" nu va aduce cost adiional, deoarece unul din fii va fi mereu inclus complet n intervalul [a, b]. Datorit faptului c nlimea unui arbore de N intervale este ntotdeauna [log2 N] + 1, ordinul de complexitate al operaiilor prezentate va fi O(log N). Necesarul de memorie Pentru a reine n memorie un arbore de intervale pentru N valori, avea nevoie de N + N / 2 + N / 4 + N / 8 + = 2 N - 1 locaii de memorie (sunt 2 N - 1 noduri). Deoarece arborele nu este complet, trebuie verificat de fiecare dat dac fiii unui nod exist n arbore (aceast verificare a fost omis n pseudocodul prezentat anterior), altfel s-ar ncerca accesarea de valori din vector care nu exist. Dac memoria disponibil este suficient, se poate declara vectorul care reine arborele de intervale de lungime 2K astfel nct 2K 2 N - 1, simulnd astfel un arbore complet i nefiind necesare verificrile menionate mai sus.

multor algoritmi de geometrie computaional. Pentru operaia de baleiere, o dreapt de baleiere vertical, imaginar, traverseaz mulimea obiectelor geometrice, de obicei de la stnga la dreapta. Baleierea ofer o metod pentru ordonarea obiectelor geometrice, de obicei, plasndu-le ntr-o structur de date, pentru obinerea relaiilor dintre ele. De obicei, algoritmii de baleiere gestioneaz dou mulimi de date: starea liniei de baleiere indic relaia dintre obiectele intersectate de linia de baleiere; lista punct-eveniment este o secven de coordonate x, ordonate de la stnga la dreapta de obicei, care definesc poziiile de oprire ale dreptei de baleiere; fiecare astfel de poziie de oprire se numete punct eveniment; numai n punctele eveniment se ntlnesc modificri ale strii liniei de baleiere. Pentru unii algoritmi lista puncteveniment este determinat dinamic n timpul execuiei algoritmului. Soluie Vom deplasa o dreapt de baleiere vertical, imaginar, de la stnga la dreapta. Lista punct-eveniment va conine capetele segmentelor orizontale i tipul acestora (extremitate stng sau extremitate dreapt) i segmentele verticale. Pe msur ce ne deplasam de la stnga la dreapta, cnd ntlnim o extremitate stng o inserm n strile dreptei de baleiere, iar cnd ntlnim o extremitate dreapt tergem extremitatea stng corespunztoare din strile dreptei de baleiere. Cnd ntlnim un segment vertical, numrul de intersecii ale acestui segment cu alte segmente orizontale va fi dat de numrul capetelor de intervale care se afl n strile dreptei de baleiere cuprinse ntre coordonatele verticale ale extremitilor segmentului vertical. Astfel, strile dreptei de baleiere trebuie s fie reprezentate de o struc-

GInfo nr. 15/4 - aprilie 2005

Timp de execuie: 1 secund/test Algoritmi de "baleiere" (line sweeping) Folosind cunotine generale de geometrie analitic se poate obine un algoritm cu ordinul de complexitate O(N2), dar acesta nu se va ncadra n limita de timp. Pentru rezolvarea acestei probleme vom folosi o tehnic ce este cunoscut sub numele de "baleiere" (engl. sweeping) care este comun

Aplicaii

36

n cele ce urmeaz vom prezenta enunurile ctorva probleme pentru a

tur de date pentru care avem nevoie de urmtoarele operaii: Insereaz(y): insereaz extremitatea y; terge(y): terge extremitatea y; Interogare(y1, y2) : determin numrul de extremiti cuprinse n intervalul [y1, y2] Fie maxc valoarea maxim a coordonatelor extremitilor de segmente. Folosind un vector pentru a implementa aceste operaii vom obine un ordin de complexitate O(1) pentru primele dou operaii i O(maxc) pentru cea de-a treia. Astfel, ordinul de complexitate al algoritmului de rezolvare a problemei va fi O(N maxc) n cazul cel mai defavorabil. Putem comprima spaiul [0 maxc] observnd c doar maxim N valori din acest interval conteaz, i anume extremitile segmentelor orizontale, astfel reducndu-se ordinul de complexitate a celei de-a treia operaii la O(N), dar algoritmul va avea ordinul de complexitate O(N2), ceea ce nu aduce nici o mbuntire fa de algoritmul trivial. Aceast situaie ne determin s cutm o structur de date mai eficient. O prim variant ar fi mprirea vectorului n buci de N elemente, reducnd astfel ordinul de complexitate la O(N N ). n continuare vom prezenta soluia bazat pe arborii de intervale. Vom folosi un arbore de intervale pentru a simula operaiile, care

erau efectuate folosind un vector obinuit, n timp logaritmic. Astfel, n fiecare nod al arborelui din intervale vom reine cte extremiti exist n acel interval. Primele dou operaii vor fi implementate folosind procedura Actualizare de mai sus pentru intervalul [y, y] n arborele T(0, maxc) i adunnd +1, respectiv -1 la fiecare nod actualizat. Cea de-a treia operaie poate fi realizat folosind funcia Interogare pentru intervalul [y1, y2]. Astfel ordinul de complexitate al algoritmului se reduce la O(N log maxc). Folosind aceeai tehnic de "comprimare" a coordonatelor se poate obine ordinul de complexitate O(N log N). n figura 2 este prezentat structura arborelui de intervale, dup actualizarea pentru intervalele [2, 2], [6, 6] i [9, 9]. Sunt marcate intervalele care conduc la obinerea numrului de segmente intersectate de primul segment vertical, obinute n urma interogrii pentru intervalul [0, 8]. Problema #2
(preluat de la IOI '98 - Portugalia)

ghiurilor, iar pe fiecare dintre urmtoarele N linii se afl cte patru numere naturale, mai mici dect 50.000, reprezentnd coordonatele carteziene ale colurior stnga-sus, respectiv dreapta-jos, ale fiecrui dreptunghi. Rezultatul va fi scris n fiierul drept.out.

focus

Exemplu
drept.in 3 3 8 8 3 6 10 12 6 12 4 15 1 drept.out 44

Timp de execuie: 1 secund/test Soluie Folosind un raionament asemntor celui utilizat n cazul primei probleme, constatm necesitatea unui algoritm de baleiere. Vom descompune problema n dou subprobleme: prima dat calculm perimetrul folosind doar laturile stnga i dreapta ale dreptunghiurilor pentru a calcula perimetrul pe axa Oy; iar apoi putem s rotim dreptunghiurile i s folosim acceai procedur pentru a calcula perimetrul pe axa Ox, folosind doar laturile sus i jos ale dreptunghiurilor. Fiecare latur (stng sau dreapt) va fi un punct eveniment. Sortm laturile cresctor n funcie de coordonata orizontal i ncepem parcurgerea de la stnga la dreapta. n momentul n care ntlnim o latur stng marcm n strile dreptei de baleiere, intervalul de uniti ocupat de latur pe axa Oy, iar cnd ntlnim o latur dreapt demarcm

Se considera N 50.000 dreptunghiuri n plan, fiecare avnd laturile paralele cu axele Ox i Oy. Lungimea marginilor (contururilor) reuniunii tuturor dreptunghiurilor se va numi perimetru. S se calculeze perimetrul celor N dreptunghiuri. n fiierul drept.in se afl pe prima linie numrul N al dreptun-

Figura 2: Arbore de intervale pentru problema #1

37

GInfo nr. 15/4 - aprilie 2005

n strile dreptei de baleiere intervalul de uniti ocupat de latur. ntre oricare dou puncte eveniment consecutive are loc o modificare a perimetrului total pe axa Oy. Astfel, dup fiecare actualizare a strilor dreptei de baleiere se va reine numrul de uniti marcate pn n prezent (nu se ine cont dac o unitate este marcat de mai multe ori). De fiecare dat vom aduna la perimetrul total pe axa Oy diferena absolut ntre numrul de uniti marcate pn n prezent i valoarea imediat anterioar (naintea actualizrii) a numrului de uniti marcate. Aadar, este necesar o structur de date care se efectueze urmtoarele operaii n timp eficient: Marcheaz(a, b): marcheaz intervalul [a, b]; Demarcheaz(a, b): demarcheaz intervalul [a, b]; Interogare: returneaz numrul total de coordonate marcate pn n prezent Putem utiliza un arbore de intervale pentru a obine un ordin de complexitate O(log maxc) sau O(log N) pentru primele dou operaii i O(1) pentru ce-a de treia. n fiecare nod al arborelui reinem de cte ori a fost marcat intervalul respectiv i cte uniti din intervalul respectiv au fost marcate. Primele dou operaii pot fi implementate folosind procedura Actualizare, iar a treia operaie va returna valoarea numrului de uniti care au fost marcate din rdcina arborelui de intervale.

n figura 3 este descris structura arborelui de intervale, dup marcarea intervalelor [3...8] i [6...10] (un interval [y1y2] reprezint intervalul de uniti [y1, y2 - 1] din arbore). Problema #3 Se dau N 100.000 puncte n plan ale cror coordonate sunt numere naturale mai mici ca 2.000.000.000. S se rspund la M 1.000.000 ntrebri de forma "cte puncte dintre cele N exist n dreptunghiul cu colul stnga-sus n punctul de coordonate (x1, y1) i colul dreapta-jos n punctul de coordonate (x2, y2)?" n fiierul puncte.in se vor afla pe prima linie numerele N i M. Pe urmtoarele N linii se afl coordonatele punctelor. Pe urmtoarele M linii se vor afla cte patru numere naturale reprezentnd coordonatele colurilor dreptunghiurilor. n fiierul puncte.out se vor afla M numere naturale reprezentnd rspunsurile la ntrebri. Exemplu
puncte.in 6 1 2 8 5 3 6 5 8 7 8 1 10 10 4 8 9 4 puncte.out 2

focus

Timp de execuie: 1 secund/test

38

Figura 3: Arbore de intervale pentru problema #2

Soluie Problema determinrii numrului de puncte din interiorul unui dreptunghi este o particularizare 2D pentru problema numit n literatura de specialitate Orthogonal Range Search. Varianta aleas pentru acest caz, const ntr-un arbore de intervale, care permite determinarea numrului de puncte din interiorul unui dreptunghi folosind un algoritm cu ordinul de complexitate O(log2 N). Astfel, se sorteaz coordonatele x ale punctelor i se construiete un arbore de intervale. Primul nivel al arborelui va conine toate coordonatele x. Cei doi fii ai rdcinii vor conine prima jumtate, respectiv a doua jumtate a punctelor (sortate n funcie de coordonata x) .a.m.d. Pentru fiecare interval de coordonate x, se menin sortate coordonatele y corespunztoare punctelor care au coordonatele x n intervalul respectiv. Astfel, memoria folosit are ordinul O(N log N). Pentru a construi efectiv se folosete o abordare asemntoare algoritmului de sortare prin interclasare: n fiecare nod, pentru a obine lista de coordonate y ordonate, se interclaseaz listele celor doi fii (deja ordonate). Cnd se ajunge ntr-o frunz, lista nodului este format dintr-un singur punct. Pentru fiecare dreptunghi, se efectueaz cutarea n arborele de intervale pentru segmentul [x1, x2] (deoarece se folosesc doar cele N coordonate x ale punctelor, se vor potrivi capetele acestui interval folosind cutarea binar la cea mai apropiat coordonat x de fiecare extremitate).

GInfo nr. 15/4 - aprilie 2005

Figura 4: Arbore de intervale pentru problema #3

poziiile corespunztoare efecturii unei cutri binare n fii pentru valoarea y. Astfel, n timpul cutrii, n loc s efectum cutri binare, se pot parcurge aceti indici care ofer n timp constant poziia n lista cutat, reducnd ordinul de complexitate la O(log N). Procedeul este ilustrat n figura 5.

rele N linii se afl coordonatele punctelor. n fiierul puncte2.out se vor gsi cinci numere naturale reprezentnd coordonatele colurilor stnga-sus i dreapta-jos ale aezrii dreptunghiului i numrul maxim de puncte din dreptunghi.

focus

Problema #6
Baraj pentru lotul naional, 2003

Pentru fiecare interval din arbore atins, se execut dou cutri binare printre coordonatele y corespunztoare coordonatelor x din acel interval, pentru a determina cte puncte din intervalul respectiv se afl n intervalul [y1, y2] (adic n interiorul dreptunghiului). Structura arborelui de intervale utilizat este prezentat n figura 4. Ordinul de complexitate O(log2 N) poate fi redus, folosind o metod descoperit independent de Willard i Lueker n anul 1978. Se observ c pentru fiecare coordonat y dintr-un nod, dac presupunem c se efectueaz o cutare binar, atunci putem determina n timpul interclasrii poziia din fiecare fiu pe care o va returna cutarea binar pentru aceeai valoare. Este evident c pentru o valoare y dintr-un nod, care a provenit dintr-un fiu n timpul interclasrii, exist o unic valoare maxim y' din cellalt fiu astfel nct y' y. Aadar, pstrm pentru fiecare valoare y dintr-un nod doi indici care identific

Probleme propuse
Prezentm n cele ce urmeaz enunurile a patru probleme care pot fi rezolvate folosind arborii de intervale. Problema #4
Olimpiada Baltic de Informatic, 2001

Se consider N 50.000 dreptunghiuri n plan, fiecare avnd laturile paralele cu axele Ox i Oy. S se determine aria ocupat de reuniunea celor N dreptunghiuri. n fiierul drept2.in se afl pe prima linie numrul N al dreptunghiurilor, iar pe fiecare dintre urmtoarele N linii se afl cte patru numere naturale mai mici dect 50.000, reprezentnd coordonatele carteziene ale colului stnga-sus, respectiv dreapta-jos ale fiecrui dreptunghi. Rezultatul se va scrie n fiierul drept2.out. Problema #5
Olimpiada Naional de Informatic, Polonia, 2001

Se consider N 100.000 puncte care au coordonate numere naturale mai mici ca 100.000. S se determine unde se pot aeza dou dreptunghiuri de lungime DX i lime DY, fr s se intersecteze, astfel nct numrul de puncte incluse n cele dou dreptunghiuri s fie maxim. n fiierul puncte3.in se afl pe prima linie numerele N, DX i DY. Pe urmtoarele N linii se afl coordonatele punctelor. n fiierul puncte3.out se vor afla nou numere naturale reprezentnd coordonatele colurilor din stnga-sus i dreapta-jos ale celor dou dreptunghiuri, precum i numrul maxim de puncte incluse n acestea. Problema #7
USACO, ianuarie 2004

Se consider N 50.000 puncte care au coordonate numere naturale mai mici dect 50.000. S se determine poziia n care se poate aeza un dreptunghi de lungime DX i lime DY, astfel nct numrul de puncte incluse n dreptunghi s fie maxim. n fiierul puncte2.in se afl pe prima linie numerele N, Figura 5: Reducerea complexitii pentru problema #3 DX i DY. Pe urmtoa-

Se consider N 250.000 dreptunghiuri n plan, fiecare avnd laturile paralele cu axele Ox i Oy, care nu se intersecteaz i nu se ating, dar pot fi incluse unul n altul. Se numete nchisoare un dreptunghi nconjurat de alte dreptunghiuri. S se determine numrul maxim de dreptunghiuri de care poate fi nconjurat o nchisoare i cte astfel de nchisori maxime exist. n fiierul inchis.in se afl pe prima linie numrul N al dreptunghiurilor, iar pe fiecare din urmtoarele N linii se afl cte patru numere naturale mai mici dect 1.000.000.000, reprezentnd coordonatele carteziene ale colului stnga-sus, respectiv dreapta-jos ale fiecrui dreptunghi. n fiierul inchis.out se vor afla dou numere naturale: numrul maxim de dreptunghiuri de care poate fi nconjurat o nchisoare i numrul acestor "nchisori" maxime.

39

GInfo nr. 15/4 - aprilie 2005

You might also like