algoritmos sweep-line e a dist^ancia de manhattanschultz/tcc/tcc.pdf · 2011-03-04 · algoritmos...

39
Algoritmos Sweep-Line e a Distˆ ancia de Manhattan Lu´ ıs Fernando Schultz Xavier da Silveira 4 de mar¸ co de 2011 Resumo Dada uma lista de n retˆ angulos no plano com os lados alinhados aos eixos, ´ e poss´ ıvel computar a ´ areadauni˜ao destes retˆ angulos e um ponto coberto por uma quantidade m´axima deles em O(n log n) atrav´ es de algoritmos sweep-line . Definindo por diamante o lugar geom´ etrico dos pontos que distam n˜ ao mais do que uma certa distˆ ancia de uma certa origem, onde a no¸ c˜ao de distˆ ancia ´ e dada pela distˆ ancia de Manhattan, tamb´ em ´ e poss´ ıvel, dada uma lista de n diamantes, calcular a ´area da uni˜ ao dos diamantes e exibir um ponto de cobertura m´ axima por estes diamantes em O(n log n). Isto pode ser feito rotacionando o plano em 45 graus, pois esta transforma¸ ao mapeia diamantes em quadrados ao mesmo tempo em que ela preserva a ´ area da uni˜ ao e estabelece uma correspondˆ encia bijetiva entre pontos de cobertura m´axima. Quando observamos o plano como um grid infinito de c´ elulas, a defini¸ ao an´ aloga para um retˆangulo´ e a de uma matriz finita de c´ elulas e a defini¸ ao an´ aloga para um diamante ´ e a do conjunto de c´ elulas que distam n˜ ao mais do que uma certa distˆancia de uma certa c´ elula de origem na distˆ ancia de Manhattan. No entanto, embora a vers˜ao do problema para retˆ angulos ainda admita a mesma solu¸ ao que o caso anterior, a vers˜ ao para diamantes ao mais admite a redu¸ ao ` a vers˜ ao para retˆ angulos, uma vez que n˜ ao ´ e verdade que a rota¸ ao do grid em 45 graus mapeia diamantes em quadrados. Felizmente, ainda ´ e poss´ ıvel resolver o problema para n diamantes em O(n log n) atrav´ es de uma redu¸ ao ao caso dos retˆ angulos. Por´ em, esta redu¸c˜ ao ´ e um pouco mais complexa que a anterior. O objetivo deste trabalho ´ e apresentar esta redu¸ ao e implementar rotinas para resolver este problema. Sum´ ario 1 Cr´ editos 2 2 Introdu¸c˜ ao 2 3 Enunciando os Problemas 3 3.1 Grids , Retˆ angulos, Diamantes e ´ Areas ................................... 3 3.2 Coberturas .................................................. 4 3.3 Os Problemas para Retˆ angulos ....................................... 4 3.4 Os Problemas para Diamantes ....................................... 4 4 Solu¸c˜ oes Sweep-Line para os Problemas para Retˆ angulos 5 4.1 A Id´ eia dos Algoritmos Sweep-Line ..................................... 5 4.2 Eventos e Sweep-Lines ............................................ 5 4.3 Os Algoritmos ................................................ 6 4.4 O Papel de Estruturas de Dados nos Algoritmos Sweep-Line ....................... 9 4.5 Compress˜ ao de Coordenadas ........................................ 10 1

Upload: others

Post on 07-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Algoritmos Sweep-Line e a Distancia de Manhattan

Luıs Fernando Schultz Xavier da Silveira

4 de marco de 2011

Resumo

Dada uma lista de n retangulos no plano com os lados alinhados aos eixos, e possıvel computar a area da uniaodestes retangulos e um ponto coberto por uma quantidade maxima deles em O(n log n) atraves de algoritmossweep-line.

Definindo por diamante o lugar geometrico dos pontos que distam nao mais do que uma certa distancia de umacerta origem, onde a nocao de distancia e dada pela distancia de Manhattan, tambem e possıvel, dada umalista de n diamantes, calcular a area da uniao dos diamantes e exibir um ponto de cobertura maxima por estesdiamantes em O(n log n). Isto pode ser feito rotacionando o plano em 45 graus, pois esta transformacao mapeiadiamantes em quadrados ao mesmo tempo em que ela preserva a area da uniao e estabelece uma correspondenciabijetiva entre pontos de cobertura maxima.

Quando observamos o plano como um grid infinito de celulas, a definicao analoga para um retangulo e a de umamatriz finita de celulas e a definicao analoga para um diamante e a do conjunto de celulas que distam nao maisdo que uma certa distancia de uma certa celula de origem na distancia de Manhattan. No entanto, embora aversao do problema para retangulos ainda admita a mesma solucao que o caso anterior, a versao para diamantesnao mais admite a reducao a versao para retangulos, uma vez que nao e verdade que a rotacao do grid em 45graus mapeia diamantes em quadrados.

Felizmente, ainda e possıvel resolver o problema para n diamantes em O(n log n) atraves de uma reducao aocaso dos retangulos. Porem, esta reducao e um pouco mais complexa que a anterior.

O objetivo deste trabalho e apresentar esta reducao e implementar rotinas para resolver este problema.

Sumario

1 Creditos 2

2 Introducao 2

3 Enunciando os Problemas 3

3.1 Grids, Retangulos, Diamantes e Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

3.2 Coberturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3.3 Os Problemas para Retangulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3.4 Os Problemas para Diamantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

4 Solucoes Sweep-Line para os Problemas para Retangulos 5

4.1 A Ideia dos Algoritmos Sweep-Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4.2 Eventos e Sweep-Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4.3 Os Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

4.4 O Papel de Estruturas de Dados nos Algoritmos Sweep-Line . . . . . . . . . . . . . . . . . . . . . . . 9

4.5 Compressao de Coordenadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1

Page 2: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

4.5.1 Definicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

4.5.2 Calculo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4.5.3 Aplicacoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4.6 Arvores de Segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4.6.1 Introducao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4.6.2 Arvores de Segmentos para o Problema CCMR . . . . . . . . . . . . . . . . . . . . . . . . . . 15

4.6.3 Arvores de Segmentos para o Problema AUR . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4.6.4 Analise de Complexidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

4.6.5 Implementacoes Iterativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4.7 Alternativas as Arvores de Segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

5 Uma Reducao dos Problemas dos Diamantes aos dos Retangulos 30

6 Implementacao em C 33

6.1 Definicoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

6.2 Utilitarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

6.3 Ordenacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

6.4 Compressao de Coordenadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

6.5 Geracao de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

6.6 Arvores de Segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

6.7 CCMR e AUR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

6.8 O Programa Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

1 Creditos

As seguintes pessoas deram uma contribuicao importante ao conteudo deste trabalho:

• Joel Uchoa: propos o problema do calculo do numero de diamantes que cobrem a celula mais coberta pordiamantes no grid como uma questao para a prova de selecao dos participantes brasileiros na OlimpıadaInternacional de Informatica (IOI) 2010.

• Wanderley Guimaraes: realizou nossa primeira implementacao do algoritmo aqui proposto para resolvereste problema e observou que, com ligeiras modificacoes, ele poderia ser transformado num algoritmo queresolve o problema do calculo da area da uniao de diamantes no grid .

2 Introducao

Diversos problemas fundamentais em geometria computacional admitem solucoes eficientes atraves de algoritmossweep-line. Por exemplo, o problema do calculo dos m pontos de interseccao determinados por n segmentos dereta no plano pode ser resolvido em O(m+n log n)[12], o problema da exibicao de dois pontos de distancia mınimadentre n pontos no plano pode ser resolvido em O(n log n)[12], o problema da construcao do diagrama de Voronoide n pontos no plano pode ser resolvido em O(n log n)[9] e o problema da construcao do casco convexo de umconjunto de n pontos no plano admite uma solucao muito mais compacta e simples [1], ainda em O(n log n), do queo tradicional Graham-Scan [10].

Dois outros problemas sao de fundamental importancia para este trabalho. Dada uma lista de n retangulos no grid(ou no plano com os lados alinhados aos eixos), eles se referem ao calculo da area da uniao destes retangulos e da

2

Page 3: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

exibicao de uma celula no grid (ou de um ponto no plano) que pertence a uma quantidade maxima de retangulos.Ambos os problemas podem ser resolvidos em O(n log n) atraves de algoritmos sweep-line [12].

Diamantes sao o lugar geometrico dos pontos que distam nao mais do que uma certa distancia, o raio do diamante,de uma certa origem em relacao a distancia de Manhattan. Mais especificamente, se a origem for (x0, y0) e o raiofor r, o diamante sera o conjunto (x, y) : |x− x0|+ |y − y0| 6 r. A figura 1 mostra o formato geral de diamantesno plano e no grid .

Figura 1: Um diamante no plano e um diamante de raio 3 no grid , respectivamente.

No plano, diamantes podem ser facilmente transformados em quadrados atraves de uma rotacao de 45 graus. Porcausa disto, o problema de, dada uma lista de n diamantes no plano, computar a area da uniao destes diamantese um ponto que pertence a uma quantidade maxima deles pode ser facilmente reduzido ao problema analogo pararetangulos. Diamantes no grid , contudo, nao admitem uma transformacao simples, no nosso conhecimento, paraque a versao do problema no grid possa ser reduzida de forma similar.

Nas proximas secoes nos iremos definir os problemas de computar a area da uniao e uma celula de cobertura maximapara retangulos e diamantes no grid de forma formal, iremos apresentar as solucoes sweep-line para os problemasdos retangulos no grid (que na verdade sao essencialmente as mesmas para retangulos no plano) e iremos derivaruma transformacao efetiva, embora nao tao simples quanto uma rotacao, para que possamos converter o problemados diamantes no grid no problema dos retangulos no grid . Ao final, iremos ainda apresentar implementacoes nalinguagem C de rotinas que resolvem estes problemas.

3 Enunciando os Problemas

Nesta secao iremos enunciar formalmente os problemas de calcular a area da uniao e uma celula de coberturamaxima em suas versoes para retangulos e diamantes, ambos no grid .

3.1 Grids, Retangulos, Diamantes e Areas

O grid e o conjunto dos pontos do plano de coordenadas inteiras, Z2. No entanto, e comum interpretar o grid ,ao menos para fins de visualizacao do conceito de area, como uma associacao entre pontos (x, y) ∈ Z2 do plano eregioes da forma [x, x+ 1]× [y, y + 1], denominadas celulas.

Definicao 1. Denotaremos o conjunto dos numeros inteiros entre a ∈ Z e b ∈ Z por

[a..b] = x ∈ Z : a 6 x 6 b.

Note que [a..b] = se a > b.

Definicao 2. Um retangulo e um subconjunto do grid da forma [x0..x1]× [y0..y1], onde x0, y0, x1, y1 ∈ Z, x0 6 x1

e y0 6 y1.

Definicao 3. Um diamante e um subconjunto do grid da forma

D((x0, y0), r) = (x, y) ∈ Z2 : |x− x0|+ |y − y0| 6 r,

onde (x0, y0) ∈ Z2 e o centro do diamante e r ∈ N e seu raio.

3

Page 4: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Definicao 4. A area de um subconjunto finito X do grid e

A(X) = #X,

a cardinalidade de X.

A area e interpretada mais facilmente entendendo X como um conjunto de celulas, todas de area unitaria.

3.2 Coberturas

Seja R = [R0, R1, . . . , Rn−1] uma lista finita de n subconjuntos de um certo conjunto Ω 6= .

Definicao 5. O numero de coberturas de x ∈ Ω por R e

ρΩR(x) = #i ∈ [0..n− 1] : x ∈ Ri.

Definicao 6. O numero maximo de coberturas de um elemento de Ω por R e

ρΩR = max

x∈ΩρΩR(x).

Este numero esta bem definido porque ρΩR(x) e limitado superiormente por n para todo x ∈ Ω 6= .

Definicao 7. O conjunto dos elementos cobertos por k ∈ N elementos de R e

σΩR(k) = x ∈ Ω : ρΩ

R(x) = k.

Definicao 8. O conjunto dos elementos de cobertura maxima (em relacao a R) e

σΩR = σΩ

R(ρΩR).

3.3 Os Problemas para Retangulos

O problema do calculo da area da uniao de retangulos no grid (AUR) pode ser descrito da seguinte forma: naentrada serao dados um numero natural n ∈ N e n quadruplas de numeros inteiros (x0,i, y0,i, x1,i, y1,i) ∈ Z4,i ∈ [0..n− 1], satisfazendo x0,i 6 x1,i e y0,i 6 y1,i para todo i, e na saıda sera pedido o numero natural

A

(n−1⋃i=0

[x0,i..x1,i]× [y0,i..y1,i]

).

Ja o problema do calculo de uma celula de cobertura maxima por retangulos no grid (CCMR) pode ser descrito deforma similar: na entrada serao dados um numero natural n e n quadruplas de numeros inteiros (x0,i, y0,i, x1,i, y1,i) ∈Z

4, i ∈ [0..n− 1], satisfazendo x0,i 6 x1,i e y0,i 6 y1,i para todo i, e na saıda sera pedida uma celula (x, y) ∈ Z2 dogrid satisfazendo (x, y) ∈ σZ2

R , onde R = [R0, R1, . . . , Rn−1] e uma lista de n retangulos tais que Ri = [x0,i..x1,i]×[y0,i..y1,i] para todo i.

3.4 Os Problemas para Diamantes

O problema do calculo da area da uniao de diamantes no grid (AUD) pode ser definido da seguinte maneira: naentrada serao apresentados um numero natural n ∈ N e n triplas de numeros (xi, yi, ri) ∈ Z×Z×N, i ∈ [0..n− 1],e na saıda sera requisitado o numero natural

A

(n−1⋃i=0

D((xi, yi), ri)

).

Ainda, o problema do calculo de uma celula de cobertura maxima por diamantes no grid (CCMD) pode serespecificado como segue: na entrada serao colocados um numero natural n ∈ N e n triplas de numeros (xi, yi, ri) ∈Z × Z × N, i ∈ [0..n − 1], e na saıda sera pedida uma celula (x, y) ∈ Z2 do grid satisfazendo (x, y) ∈ σZ2

R , ondeR = [R0, R1, . . . , Rn−1] e uma lista de n diamantes no grid tais que Ri = D((xi, yi), ri) para todo i.

4

Page 5: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

4 Solucoes Sweep-Line para os Problemas para Retangulos

Nesta secao iremos mostrar como os problemas AUR e CCMR podem ser eficientemente resolvidos atraves dealgoritmos sweep-line. Partes dos algoritmos descritos aqui serao deixadas em aberto ate que tenhamos realizadoum estudo de arvores de segmentos na secao 4.6.

4.1 A Ideia dos Algoritmos Sweep-Line

Algoritmos sweep-line em geral se baseiam em invariantes que as instancias do problema obedecem em um dossemi-planos determinados por uma reta (a sweep-line, que e usualmente vertical) e em estrategias eficientes paramanter essas invariantes mediante o deslocamento desta reta.

Por exemplo, no caso do problema AUR, podemos considerar a area α da uniao da interseccao dos retanguloscom o conjunto das celulas de abscissa menor que um certo valor x0. Se a sweep-line se deslocar para uma novaabscissa x1 (x0 6 x1) e o conjunto Y das ordenadas das celulas que estao na uniao dos retangulos e possuem comoabscissa a abscissa da sweep-line nao variar conforme a sweep-line se desloca assumindo coordenadas em [x0..x1−1],temos que a area da uniao da interseccao dos retangulos com o conjunto das celulas de abscissa menor que x1 seraα+ (x1 − x0)×#Y . A figura 2 ilustra esta ideia.

Figura 2: A area adicionada quando a sweep-line se desloca de x0 para x1.

4.2 Eventos e Sweep-Lines

Se imaginamos que uma linha, a sweep-line, se desloca da esquerda para a direita por todo o plano, e naturala nocao de evento. Um evento ocorre quando a sweep-line encontra um lado vertical de um dos retangulos. Narealidade, se estamos trabalhando no grid , um evento ocorre quando a sweep-line, que e uma coluna infinita decelulas, cobre a primeira coluna de um retangulo (um evento de entrada) ou deixa de cobrir a ultima coluna de umretangulo (um evento de saıda).

Mais ainda, eventos possuem um ordenamento natural dado pelo “tempo” de ocorrencia dos mesmos. E processandoeventos nessa ordem que os algoritmos sweep-line irao se desenrolar.

Definicao 9. O espaco de eventos e o conjunto

E = (x, a, b, t) ∈ Z× Z× Z× +,− : a 6 b .

5

Page 6: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Um evento e um elemento e = (x, a, b, t) ∈ E. Chamaremos de a abscissa do evento o valor x, de o intervalode ordenadas do evento o conjunto [a..b] e de o tipo do evento o sımbolo t. Se t = +, diremos que o evento e umevento de entrada e se t = −, diremos que o evento e um evento de saıda.

Definicao 10. A ordem de execucao de eventos e um ordenamento parcial ≺⊆ E × E definido por

(x, a, b, t) ≺ (x′, a′, b′, t′)⇐⇒ x < x′.

Seja entao R = [R0, R1, . . . , Rn−1] uma lista de n retangulos no grid , onde Ri = [x0,i..x1,i] × [y0,i..y1,i] para cadai ∈ [0..n− 1].

Definicao 11. Definimos uma lista de eventos gerados por R como um ordenamento da lista [e0, e1, . . . , e2n−1]pelo ordenamento parcial ≺, onde

e2i = (x0,i, y0,i, y1,i,+) e e2i+1 = (x1,i + 1, y0,i, y1,i,−)

para todo i ∈ [0..n− 1].

4.3 Os Algoritmos

Aqui iremos definir formalmente os algoritmos que iremos empregar para resolver os problemas AUR e CCMR.

Comecamos mostrando um algoritmo para gerar uma lista de eventos para R.

Gera-Lista-de-Eventos(R):1 E ←uma lista de 2n elementos2 para i de 0 ate n− 1 faca3 E2i ← (x0,i, y0,i, y1,i,+)4 E2i+1 ← (x1,i + 1, y0,i, y1,i,−)5 ordene E por ≺6 retorne E

Dado que podemos ordenar um vetor de n elementos em O(n log n) como descrito em [2], este algoritmo pode serimplementado em O(n log n) tambem.

Agora iremos exibir um algoritmo para resolver o problema AUR.

Area-da-Uniao-de-Retangulos(R):1 E ←Gera-Lista-de-Eventos(R)2 S ←uma lista vazia3 α← 04 para i de 0 ate 2n− 2 faca5 (x, a, b, t)← Ei6 se t = + ent~ao7 insere (a, b) em S8 sen~ao9 remove uma copia de (a, b) de S

10 (x′, a′, b′, t′)← Ei+1

11 α← α+ (x′ − x) ·#⋃

(a,b) em S

[a..b]

12 retorne a

O estado deste algoritmo durante sua execucao e composto duas variaveis: S e α. S e uma lista de pares ordenadosrepresentando intervalos nao-vazios de numeros inteiros e α e um numero natural. Inicialmente, e computada umalista de eventos E gerada por R. A principal invariante deste algoritmo e que, toda a vez que ele chega na linha4, antes de testar a condicao do loop, a area da uniao das interseccoes dos retangulos em R com o conjunto dascelulas de coordenadas x menores que xi, onde xi e a abscissa do i-esimo evento em E, e igual a α. Ainda, ira valer

6

Page 7: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

que sempre que xi < xi+1, quando o algoritmo estiver executando a linha 11, o conjunto das ordenadas das celulasna uniao dos retangulos em R de abscissa x sera o mesmo para todo x satisfazendo xi 6 x < xi+1 e este conjuntopodera ser expresso como a uniao dos intervalos em S.

Brevemente demonstraremos a corretude deste algoritmo com base no que foi descrito anteriormente. Porem, antesdisso, cabe dizer que e possıvel implementa-lo em O(n log n) se utilizarmos uma estrutura de dados apropriada paramanter a lista S. Mais detalhes de como isto pode ser feito estao nas secoes 4.4, 4.5 e 4.6.

Teorema 1. O algoritmo Area-da-Uniao-de-Retangulos(R) corretamente computa a area da uniao da listade retangulos R.

Demonstracao. Apos o calculo de uma lista de eventos gerados por R na linha 1, defina xi como a abscissa doevento Ei.

A demonstracao sera baseada na seguinte invariante de loop: toda vez que o algoritmo passa pela linha 4 (antes deexecutar a comparacao do loop), e valido que α = #Ai, onde

Ai =

(x, y) ∈n−1⋃j=0

Rj : x < xi

.

Como a lista E esta ordenada por ≺, x0 6 xi para todo i. Ainda, cada celula (x, y) de um retangulo e tal quexu 6 x < xv para ındices u e v, e assim x0 6 x, donde concluımos que A0 = . Mas como inicializamos α como 0na linha 3, temos que comecamos a invariante corretamente.

Suponha agora que a invariante valha quando entramos na linha 4 para um determinado valor de i. Se xi = xi+1,temos que o valor de α ficara o mesmo e, por definicao, Ai = Ai+1, e assim a invariante sera trivialmente mantida.

Suponha entao, sem perda de generalidade, que xi < xi+1. Considere entao que o algoritmo foi executado ate alinha 11 (nao a tendo executado ainda). Seja entao

C(x) =

y ∈ Z : (x, y) ∈n−1⋃j=0

Rj

.

Chamaremos de C(x) o corte dos retangulos na abscissa x.

Gostarıamos de demonstrar que C(x) = C(xi) para todo x satisfazendo xi 6 x < xi+1. Fixe entao um x satisfazendoesta restricao. Vamos mostrar que y ∈ C(x)⇐⇒ y ∈ C(xi) para todo y ∈ Z. Suponha entao que y ∈ C(xi). Existeentao um retangulo Rj tal que (xi, y) ∈ Rj . Logo x0,j 6 xi 6 x1,j . Mas x1,j > xi+1 − 1, pois do contrario o eventode saıda de Rj teria abscissa x1,j + 1, mas xi < x1,j + 1 < xi+1, contradizendo a lista E estar ordenada por ≺ (esteevento deveria vir antes do evento i+ 1 e depois do evento i). Logo x0,j 6 xi 6 x 6 x1,j , pois x < xi+1 6 x1,j + 1.Assim a celula (x, y) tambem pertence a Rj e y ∈ C(x). A prova de y ∈ C(x) =⇒ y ∈ C(xi) e analoga.

Agora mostraremos queC(xi) =

⋃(a, b) em S

[a..b].

Para isso, considere um retangulo Rj . Se x1,j < xi, temos que seu evento de saıda tem abscissa x1,j + 1 6 xi eportanto ja foi processado. Assim, a copia que seu evento de entrada deixou em S ja foi retirada. Similarmente,se x0,j > xi, seu evento de entrada ainda nao foi processado e assim seu evento de saıda ainda nao foi processado.Portanto nenhum evento gerado por este retangulo afetou a lista S ainda. Finalmente, se x0,j 6 xi 6 x1,j , seuevento de entrada (abscissa x0,j 6 xi) ja foi processado mas seu evento de saıda (abscissa x1,j + 1 > xi) ainda naoe, portanto, S contem uma copia do intervalo de ordenadas [ai..bi] de Rj . Assim, concluımos que S e uma listacontendo uma copia de cada intervalo de ordenadas de retangulos que intersectam (xi, y) : y ∈ Z, a sweep-line, eassim o resultado segue.

Para manter a invariante, precisamos somar em α o valor #B, onde

B =

(x, y) ∈n−1⋃j=0

Rj : xi 6 x < xi+1

,

7

Page 8: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

pois Ai ∩B = e Ai ∪B = Ai+1. Mas

#B =xi+1−1∑x=xi

#

y ∈ Z : (x, y) ∈n−1⋃j=0

Rj

=xi+1−1∑x=xi

#C(x) = (xi+1 − xi)#C(xi).

E isso mostra que o assinalamento de α na linha 11 preserva o invariante.

Dessa forma acabamos de demonstrar que este invariante de loop e preservado durante toda a execucao do algoritmoe assim que, em particular, ele vale na passagem pela linha 4 quando i = 2n− 1.

Porem, por um argumento similar ao que fizemos no inıcio da demonstracao, nao ha celula na uniao dos retanguloscom abscissa maior ou igual a x2n−1, e assim

#A2n−1 = #n−1⋃j=0

Rj .

Mas como α = #A2n−1, temos que o algoritmo retorna o valor correto na linha 12, e isso conclui a sua prova decorretude.

Iremos agora exibir um algoritmo para tratar do problema CCMR.

Celula-de-Maior-Cobertura(R):1 E ←Gera-Lista-de-Eventos(R)2 S ←uma lista vazia3 ρ← 04 (x∗, y∗)← (0, 0)5 para i de 0 ate 2n− 2 faca6 (x, a, b, t)← Ei7 se t = + ent~ao8 insere (a, b) em S9 sen~ao

10 remove uma copia de (a, b) de S11 (x′, a′, b′, t′)← Ei+1

12 se x 6= x′ ent~ao13 ρ′ ← ρZS14 se ρ′ > ρ ent~ao15 ρ← ρ′

16 x∗ ← x17 y∗ ←alguem em σZS18 retorna (x∗, y∗)

Os comentarios e a demonstracao da corretude deste algoritmo a seguir serao analogos aos do algoritmo anterior.

O estado deste algoritmo e constituıdo de quatro variaveis: S, ρ, x∗ e y∗. S e uma lista de pares ordenadosrepresentando intervalos nao-nulos de numeros inteiros, ρ e um numero natural e (x∗, y∗) ∈ Z2 sao as coordenadasde uma celula do grid. No inıcio do algoritmo e calculada uma lista de eventos E gerada por R. A invariante maisimportante que este algoritmo ira manter e que, toda vez que ele passa pela linha 5 (antes de testar a condicao doloop), (x∗, y∗) e um ponto coberto por uma quantidade maxima de elementos na lista da interseccao dos retangulosem R com o conjunto de celulas do grid com abscissa x menor do que xi, xi sendo a abscissa do i-esimo eventode E, e ρ e a quantidade destes elementos cobrindo (x∗, y∗). Ainda, sempre que xi < xi+1 para algum i, quandoo algoritmo estiver passando pela linha 12 (antes de executa-la), a lista dos intervalos de ordenadas das celulas deum retangulo de R que possuem abscissa x sera, a menos de uma permutacao, a mesma para todo x satisfazendoxi 6 x < xi+1. Alem disso, esta lista sera, apos os intervalos vazios serem removidos, uma permutacao de S.

Antes de provarmos que este algoritmo funciona corretamente, cabe dizer que se utilizarmos uma estrutura de dadosapropriada para implementar a lista S, podemos fazer com que ele execute em O(n log n). Mais detalhes de comoisso pode ser feito estao nas secoes 4.4, 4.5 e 4.6.

Teorema 2. O algoritmo Celula-de-Maior-Cobertura(R) corretamente computa uma celula em σZ2

R .

8

Page 9: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Demonstracao. Apos a execucao da linha 1, onde obtemos uma lista E de eventos gerados por R, defina xi comoa abscissa do i-esimo evento.

A demonstracao tera como base a seguinte invariante de loop: toda vez que o algoritmo passa pela linha 5 (antesde executar a comparacao do loop), e valido que

ρ = ρZ2

Aie (x∗, y∗) ∈ σZ2

Ai,

onde Ai e a lista de n elementos(x, y) ∈ Rj : x < xin−1

j=0 .

Como E foi ordenado por ≺, xi 6 xi+1 para todo i. Alem disso, pelo modo como foram gerados os eventos, cadacelula (x, y) de um retangulo e tal que xu 6 x < xv para ındices u e v, e assim x0 6 x, e portanto a lista Ai contemapenas intervalos vazios no inıcio do algoritmo. Dessa forma, a inicializacao de ρ como 0 e a de (x∗, y∗) como umponto qualquer sao suficientes para comecar a invariante corretamente.

Suponha entao que a invariante valha quando entramos na linha 5 para um determinado valor de i. Se xi = xi+1, alista Ai nao muda incrementando i (Ai = Ai+1) e, pela checagem feita na linha 12, os valores de ρ, x∗ e y∗ tambemnao. Portanto nesse caso a invariante e mantida trivialmente.

Suponha entao, sem perda de generalidade, que xi < xi+1. Considere entao que o algoritmo executou ate a linha12 (exclusive). Defina

C(x) = y ∈ Z : (x, y) ∈ Rjn−1j=0 .

Por um argumento completamente analogo ao empregado no teorema 1, C(x) = C(xi) para todo x satisfazendoxi 6 x < xi+1.

O que gostarıamos de mostrar agora e que se removermos todos os intervalos vazios da lista C(xi), obteremos umapermutacao da lista S. Para isso, considere um retangulo Rj . Se x1,j < xi, o retangulo Rj ja teve seus doiseventos processados, nao contribuindo nenhum intervalo para S, e assim marcamos para remocao em C(xi) seuj-esimo elemento. Similarmente, se x0,j > xi, o evento de entrada (e logo o de saıda) do retangulo Rj ainda naofoi processado, e assim ele tambem nao contribuiu nenhum intervalo para S e podemos marcar o j-esimo elementode C(xi) para remocao.

Remova agora os elementos marcados de C(xi). Vamos mostrar que esta lista resultante e uma permutacao da listados intervalos em S. Seja entao j tal que x0,j 6 xi 6 x1,j . O evento de entrada deste retangulo (abscissa x0,j) foiprocessado mas seu evento de saıda (abscissa x1,j + 1 > xi) ainda nao. Assim, ele contribui um intervalo [y0,j ..y1,j ]para S. E como S nao possui outros intervalos (analisamos todas as possibilidades para Rj), o resultado segue.

Para manter a invariante, observe que uma celula (x′, y′) ∈ σZ2

Ai+1deve satisfazer ou x′ < xi ou xi 6 x′ < xi+1.

Dentre as celulas que satisfazem x′ < xi temos que (x∗, y∗) e uma celula coberta por uma quantidade maxima deelementos. Agora considere que xi 6 x′ < xi+1. Nesse caso, note que ρZ

2

Ai+1= ρZ

2

Ai+1\Ai = ρZC(x′) = ρZC(xi) = ρZS .

Como o teste executado na linha 14 e suficiente para discernir se existe uma celula em σZ2

Ai+1com coordenada menor

do que xi, a invariante e mantida. Isso ocorre porque se ela existir, nossa decisao de manter (x∗, y∗) sera corretae, se ela nao existir, a nova celula tera coordenada (xi, y′), onde y′ ∈ σZS , de forma que ρZ

2

Ai+1(xi, y′) = ρZC(xi)(y

′) =

ρZS(y′) = ρZS e (xi, y′) ∈ σZ2

Ai+1.

Assim, quando o loop acaba com i valendo 2n− 1, a invariante nos mostra que (x∗, y∗) ∈ σZ2

A2n−1, mas A2n−1 = R,

pois todo retangulo Rj em R satisfaz x1,j < x2n−1 e isso conclui a demonstracao.

4.4 O Papel de Estruturas de Dados nos Algoritmos Sweep-Line

Um ponto importante que ficou em aberto nos algoritmos Area-da-Uniao-de-Retangulos e Celula-de-Maior-Cobertura e a representacao da lista S. Se ela for representada como uma simples sequencia de pares or-denados de numeros inteiros, as operacoes de insercao e remocao (linhas 7 e 9 de Area-da-Uniao-de-Retangulose linhas 8 e 10 de Celula-de-Maior-Cobertura) podem ser implementadas em O(1) e O(n), respectivamente.Isso em si e ineficiente para nossos propositos, pois dessa forma os dois algoritmos teriam como limite superior noseu tempo de execucao apenas O(n2), sem contar o tempo tomado pela operacao de calculo da cardinalidade dauniao (linha 11 de Area-da-Uniao-de-Retangulos) ou do calculo de ρZS e de um elemento de σZS (linhas 13 e17 de Celula-de-Maior-Cobertura).

9

Page 10: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Alias, essas operacoes sao as mais difıceis de se implementar eficientemente, visto que uma implementacao ingenuatem uma complexidade que depende (ao menos linearmente) da magnitude das coordenadas da entrada, algo que ealtamente indesejavel, pois estes valores podem ser muito grandes.

Os principais resultados que iremos demonstrar nesta secao sao referentes a limites superiores para o tempo deexecucao dos algoritmos que expusemos na secao anterior se pudermos assumir certos limites superiores para asprincipais operacoes na lista S. Com eles, poderemos nos preocupar, daqui em diante, apenas em implementar Seficientemente, deixando para tras a natureza geometrica dos problemas.

Teorema 3. Suponha que exista uma implementacao de S tal que as operacoes de insercao de um intervalo, remocaode uma copia de um intervalo existente e calculo da cardinalidade da uniao dos intervalos possam ser implementadastodas em O(log n). Entao, com essa implementacao, o algoritmo Area-da-Uniao-de-Retangulos roda emO(n log n).

Demonstracao. O loop da linha 4 tem O(n) iteracoes, sendo que em cada uma delas cada operacao descrita eexecutada no maximo uma vez.

Teorema 4. Suponha que exista uma implementacao de S tal que as operacoes de insercao de um intervalo, remocaode uma copia de um intervalo existente, calculo de ρZS e calculo de um elemento em σZS possam ser implementadasem O(log n). Entao, com essa implementacao, o algoritmo Celula-de-Maior-Cobertura roda em O(n log n).

Demonstracao. O loop da linha 5 tem O(n) iteracoes, sendo que em cada uma delas cada operacao descrita eexecutada no maximo uma vez.

4.5 Compressao de Coordenadas

Em varios algoritmos, nao so geometricos, a habilidade de indexar valores por coordenadas e essencial. Tecnicasmodernas de implementacao de arrays associativos tornam isso possıvel, usualmente custando O(log n) por mape-amento dentro de um espaco de n coordenadas. Contudo, para a maioria das aplicacoes, a constante envolvida nanotacao O destas tecnicas e muito alta, alem de suas implementacoes serem nao-triviais em geral.

O que descreveremos aqui e um metodo para utilizar o conhecido problema da ordenacao para possibilitar umaversao um pouco mais restrita deste tipo de mapeamento. Os algoritmos envolvidos sao, portanto, bem estudadose altamente eficientes.

4.5.1 Definicao

Definicao 12. Seja a0, a1, . . . , an−1 ∈ Z uma sequencia finita de n coordenadas inteiras. Uma compressao decoordenadas para a0, a1, . . . , an−1 e um par de funcoes (ϕ, ξ) da forma

ϕ : [0..n− 1] −→ [0..n− 1]i 7−→ ϕ(i) e

ξ : Im(ϕ) −→ Z

y 7−→ ξ(y)

satisfazendo as seguintes condicoes:

• Preservacao da ordem: para todos i, j ∈ [0..n− 1], ai < aj ⇐⇒ ϕ(i) < ϕ(j).

• Compacidade: existe m ∈ [0..n] tal que Im(ϕ) = [0..m− 1].

• Consistencia: para todo i ∈ [0..n− 1], ξ(ϕ(i)) = ai.

Proposicao 1. Seja (ϕ, ξ) uma compressao de coordenadas para a0, a1, . . . , an−1 ∈ Z. Entao, para todos x, y ∈Im(ϕ), x < y ⇐⇒ ξ(x) < ξ(y).

Demonstracao. Sejam i e j tais que x = ϕ(i) e y = ϕ(j). Entao x < y ⇐⇒ ϕ(i) < ϕ(j)⇐⇒ ai < aj ⇐⇒ ξ(ϕ(i)) <ξ(ϕ(j))⇐⇒ ξ(x) < ξ(y).

10

Page 11: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

A ideia e que uma compressao de coordenadas mapeia as coordenadas a0, a1, . . . , an−1 em um conjunto “pequeno”e contıguo de numeros inteiros, nominalmente algum conjunto da forma [0..m − 1] para algum m ∈ [0..n], quepode ser usado como o conjunto de entradas de um vetor. A compressao de coordenadas precisa preservar a ordemrelativa das coordenadas e, alem disso, deve ser possıvel obter as coordenadas originais a partir das coordenadascomprimidas. Note, no entanto, que nao e possıvel obter as coordenadas comprimidas a partir das coordenadasoriginais: devemos usar um ındice de uma coordenada original.

A figura 3 mostra um exemplo de compressao de coordenadas.

Figura 3: Uma compressao de coordenadas para uma sequencia de 11 elementos. A tabela define a sequencia e afuncao ϕ. A funcao ξ esta ilustrada graficamente. Seu domınio, o intervalo [0..m− 1] com m = 8, esta representadoem baixo de seu contradomınio, os numeros inteiros. O domınio e a imagem de ξ estao hachurados.

4.5.2 Calculo

Como as funcoes ϕ e ξ sao funcoes de domınios da forma [0..k − 1] para determinados valores de k, e natural que,em nossos algoritmos, representemos estas duas funcoes como vetores. Assim sendo, podemos exibir um algoritmopara computar uma compressao de coordenadas, mas primeiro precisamos das seguintes definicoes.

Definicao 13. As funcoes projecao em Z2 sao

π0 : Z2 −→ Z

(x, y) 7−→ xe

π1 : Z2 −→ Z

(x, y) 7−→ y.

Definicao 14. O ordenamento parcial de pares de numeros inteiros ≺′⊆ Z2×Z2 e definido por (a, b) ≺′ (x, y)⇐⇒a < x.

Consideremos entao o seguinte algoritmo.

11

Page 12: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Compressao-de-Coordenadas(a0, a1, . . . , an−1):1 para i de 0 ate n− 1 faca2 bi ← (ai, i)3 ordene b0, b1, . . . , bn−1 pelo ordenamento parcial ≺′4 m← 05 i← 06 enquanto i 6= n faca7 j ← i8 enquanto j 6= n ∧ π0(bi) = π0(bj) faca9 ϕ(π1(bj))← m

10 j ← j + 111 ξ(m)← π0(bi)12 m← m+ 113 i← j14 retorne (m,ϕ, ξ)

Antes de demonstrar que ele esta correto, vamos considerar sua eficiencia. Durante a execucao das linhas de 7 a 13,o valor de i e incrementado no numero de vezes que o loop da linha 8 e executado. Como este loop e executado nomınimo uma vez (a condicao e sempre verdadeira para i = j), o valor de i sempre e incrementado em ao menos um.Assim, as linhas 9 e 10 sao executadas precisamente n vezes e as linhas 7, 8, 11, 12 e 13 sao executadas no maximon vezes. Portanto o loop da linha 6 roda em O(n). Alem disso, o loop da linha 1 obviamente roda em O(n), o quefaz a ordenacao na linha 3, que roda em O(n log n), dominar o custo do algoritmo. Temos entao que o algoritmocomo um todo roda em O(n log n).

A demonstracao da corretude deste algoritmo se dara atraves do seguinte resultado.

Teorema 5. Se (m,ϕ, ξ) e retornado por uma chamada a Compressao-de-Coordenadas(a0, a1, . . . , an−1),entao (ϕ, ξ) e uma compressao de coordenadas para a0, a1, . . . , an−1 e Im(ϕ) = [0..m− 1].

Demonstracao. Durante esta demonstracao os valores de b0, b1, . . . , bn−1 serao considerados ordenados por ≺′ assu-mindo que o algoritmo ja passou pela linha 3. Defina entao Xi = π1(b0), π1(b1), . . . , π1(bi−1). Iremos demonstrara seguinte invariante de loop: toda vez que o algoritmo passa pela linha 6, antes de executar a comparacao, saovalidas as seguintes afirmacoes, considerando os valores atuais de i e m.

• ϕ ja foi definida no domınio Xi e ξ ja foi definida no domınio [0..m− 1].

• Para todos os valores p, q ∈ Xi, ap < aq ⇐⇒ ϕ(p) < ϕ(q).

• Im(ϕ) = [0..m− 1] = Dom(ξ).

• Para todo p ∈ Xi, ξ(ϕ(p)) = ap.

• Ou i ∈ 0, n ou π0(bi−1) < π0(bi).

Na primeira vez que o algoritmo passa pela linha 6, temos i = m = 0, entao as afirmacoes acima sao triviais, poisXi = [0..m− 1] = Im(ϕ) = Dom(ξ) = .Suponha entao que o algoritmo esteja na linha 6 e estas condicoes se verifiquem. Vamos mostrar que se ele retornara esta linha as condicoes ainda serao verificadas. Podemos entao assumir, sem perda de generalidade, que i 6= n,uma vez que i = n implica que o loop sera cancelado.

Defina k = 1 + maxj ∈ [i..n− 1] : π0(bi) = π0(bj). Claramente, π0(bi) = π0(bi+1) = · · · = π0(bk−1) e ou k = n ouπ0(bk−1) < π0(bk). Quando o algoritmo executar as linhas de 7 a 13, antes de retornar a linha 6, as seguintes acoesserao executadas:

• ϕ(p) sera definida para p ∈ π1(bi), π1(bi+1), . . . , π1(bk−1) = Xk \Xi como m.

• ξ(m) sera definida como π0(bi).

• m sera incrementado.

12

Page 13: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

• i se tornara k.

Portanto, para manter a invariante precisamos provar que:

• ϕ estara definida em Xk e ξ estara definida em [0..m].

• Se p, q ∈ Xk mas p 6∈ Xi ou q 6∈ Xi, entao ap < aq ⇐⇒ ϕ(p) < ϕ(q).

• Im(ϕ) = [0..m] = Dom(ξ).

• Para todo p ∈ Xk \Xi, ξ(ϕ(p)) = ap.

• Ou k = n ou π0(bk−1) < π0(bk).

A primeira afirmacao e trivial. A segunda pode ser mostrada da seguinte forma. Seja p, q ∈ Xk com p = π1(bx)e q = π1(by). Suponha primeiro que 0 6 x < i 6 y < k de forma que p ∈ Xi mas q 6∈ Xi. Neste caso,pela definicao de b0, b1, . . . , bn−1, temos que ap = π0(bx) e aq = π0(by). Pela quinta hipotese da invariante,π0(bx) < π0(bi) = · · · = π0(by) = · · · = π0(bk−1), donde ap = π0(bx) < π0(by) = aq. Mas ϕ(p) < m = ϕ(q),pois m e sempre incrementado durante o curso do algoritmo e seu valor atual so foi usado para definir ϕ(x) parax ∈ Xk \Xi, o que prova este caso. Suponha agora que i 6 p, q < k, ou seja, p, q ∈ Xk \Xi. Temos, similarmente,que ap = π0(bx) = π0(by) = aq e tambem temos que ϕ(p) = m = ϕ(q), o que prova esta afirmacao.

A terceira afirmacao tambem e trivial. Para demonstrar a quarta afirmacao, observe que se p ∈ Xk \Xi, ϕ(p) = me assim ξ(ϕ(p)) = ξ(m) = π0(bi) = · · · = π0(bx) = ap, onde p = π1(bx). Logo, ξ(ϕ(p)) = ap para todo p ∈ Xk \Xi,o que prova o resultado.

A quinta e ultima afirmacao e simples: se k 6= n, entao π0(bk−1) = π0(bk) contradiz a maximalidade de k, conformesua definicao.

Com a invariante demonstrada, podemos olhar para o que ocorre apos a ultima iteracao do algoritmo, ou seja,quando i = n. Especificamente, a primeira, segunda, terceira e quarta afirmacoes sao precisamente a definicao de(ϕ, ξ) ser uma compressao de coordenadas para a0, a1, . . . , an−1, pois, visto que x 7→ π1(bx) e uma permutacao de[0..n− 1] (pela definicao de b0, b1, . . . , bn−1), temos que Xn = [0..n− 1].

Finalmente, o fato de Im(ϕ) = [0..m− 1] pode ser extraıdo da terceira afirmacao da invariante.

4.5.3 Aplicacoes

A compressao de coordenadas e uma tecnica que pode ser utilizada para reduzir problemas a casos particulares emque estruturas de dados eficientes podem ser utilizadas. Por exemplo, considere o problema do calculo do numero desubsequencias crescentes de uma determinada sequencia a0, a1, . . . , an−1 (possivelmente modulo algum valor paralimitar a magnitude da resposta). Se (ϕ, ξ) e uma compressao de coordenadas para a0, a1, . . . , an−1, entao o numerode subsequencias crescentes e igual para a0, a1, . . . , an−1 e ϕ(a0), ϕ(a1), . . . , ϕ(an−1). Contudo, temos que ϕ(ai) < npara todo i, e assim podemos indexar as coordenadas, possibilitando uma solucao eficiente em O(n log n) atravesdo uso de arvores de Fenwick [8][11].

O que se pode observar deste exemplo e que a compressao de coordenadas e um artifıcio muito util para lidarcom problemas onde a ordem dos elementos e o que importa, nao a magnitude deles. E um exercıcio interessantedemonstrar que o numero de retangulos que cobrem um ponto coberto por uma quantidade maxima de retangulosnuma lista finita de retangulos nao varia se as coordenadas no eixo x e no eixo y dos retangulos forem comprimidas.Um resultado ligeiramente diferente sera demonstrado no final desta secao.

As estruturas de dados que iremos utilizar para resolver os problemas AUR e CCMR so sao realmente eficientesse pudermos assumir que as coordenadas y dos eventos estao contidas em um intervalo de numeros inteiros decomprimento O(n). Se isso nao se verificar, elas serao em geral terrıvelmente ineficientes.

Mas os problemas que iremos resolver tratam de coordenadas y gerais. Assim, e o proposito desta secao estabelecerum resultado que nos possibilitara reduzir o problema CCMR a uma versao onde as coordenadas y sao limitadas, deforma que nossa estrutura de dados seja eficiente o suficiente para aplicarmos o teorema 4. O problema AUR temuma reducao um pouco mais complicada, pois ela esta fortemente ligada a estrutura de dados que iremos utilizar,e assim nos iremos postergar esta reducao ate que tenhamos tratado dela com mais propriedade.

13

Page 14: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Teorema 6. Seja R = [R0, R1, . . . , Rn−1] uma lista de n retangulos onde Ri = [x0,i..x1,i] × [y0,i..y1,i]. Sejama0, a1, . . . , a2n−1 ∈ Z definidos por a2i = y0,i e a2i+1 = y1,i para todo i ∈ [0..n − 1]. Seja (ϕ, ξ) uma compressaode coordenadas para a0, a1, . . . , a2n−1. Defina entao R′ = [R′0, R

′1, . . . , R

′n−1] como uma lista de n retangulos onde

R′i = [x0,i..x1,i]× [ϕ(2i)..ϕ(2i+ 1)]. Entao ρZ2

R = ρZ2

R′ e, se (x, y) ∈ σZ2

R′ , (x, ξ(y)) ∈ σZ2

R .

Demonstracao. Seja (x, y) ∈ σZ2

R′ um ponto coberto pelos retangulos R′i0 , R′i1, . . . , R′ik−1

, onde k = ρZ2

R′ e ip 6= iqsempre que p 6= q, 0 6 p, q < k. Seja j = ip para algum p ∈ [0..k − 1]. (x, y) ∈ R′j e equivalente a x0,j 6 x 6 x1,j

e ϕ(2j) 6 y 6 ϕ(2j + 1). Como ϕ(2j) 6 y 6 ϕ(2j + 1) e a imagem de ϕ e contıgua, y ∈ Im(ϕ). Dessa forma, pelaproposicao 1, temos que

ϕ(2j) 6 y 6 ϕ(2j + 1) ⇐⇒ ξ(ϕ(2j)) 6 ξ(y) 6 ξ(ϕ(2j + 1))⇐⇒ a2j 6 ξ(y) 6 a2j+1

⇐⇒ y0,j 6 ξ(y) 6 y1,j ,

o que mostra que (x, ξ(y)) ∈ Rj .

Assim, conseguimos um ponto, nominalmente (x, ξ(y)), coberto por ao menos k = ρZ2

R′ retangulos de R, o que esuficiente para concluırmos que ρZ

2

R > ρZ2

R′ . Dessa forma, se pudermos provar que ρZ2

R 6 ρZ2

R′ , teremos concluıdo ademonstracao, pois ρZ

2

R (x, ξ(y)) > ρZ2

R′ > ρZ

2

R =⇒ (x, ξ(y)) ∈ σZ2

R .

De fato, se ρZ2

R = 0, o resultado e imediato. Se ρZ2

R 6= 0 e (x, y) ∈ σZ2

R de forma que ρZ2

R (x, y) = ρZ2

R , entao existe Ri

emR tal que y > y0,i, pois do contrario ρZ2

R (x, y) = 0. Assim podemos definir y′ = max

y′ ∈

n−1⋃i=0

y0,i, y1,i : y′ 6 y

.

Se (x, y) ∈ Ri para algum i, x0,i 6 x 6 x1,i e y0,i 6 y′ 6 y 6 y1,i, de forma que (x, y′) ∈ Ri, o que mostra queρZ

2

R (x, y′) > ρZ2

R (x, y) = ρZ2

R . Mas, pela definicao de y′, existe j ∈ [0..2n− 1] tal que aj = y′. Assim,

(x, ϕ(j)) ∈ R′i ⇐⇒ x0,i 6 x 6 x1,i ∧ ϕ(2i) 6 ϕ(j) 6 ϕ(2i+ 1)⇐⇒ x0,i 6 x 6 x1,i ∧ a2i 6 aj 6 a2i+1

⇐⇒ x0,i 6 x 6 x1,i ∧ y0,i 6 y′ 6 y1,i,

o que e verdadeiro. Dessa forma, o ponto (x, ϕ(y)) pertence a R′i sempre que (x, y) ∈ Ri, o que mostra queρZ

2

R′ > ρZ

2

R , como desejavamos.

Por causa deste resultado, podemos desenvolver um algoritmo que, em O(n log n) comprime as coordenadas no eixoy dos retangulos e entao executa Celula-de-Cobertura-Maxima com a nova lista de retangulos, tambem emO(n log n). A diferenca e que agora a nossa estrutura de dados podera assumir que as coordenadas y dos eventosestao no intervalo [0..2n− 1], como querıamos.

4.6 Arvores de Segmentos

4.6.1 Introducao

Arvores de segmentos sao estruturas de dados gerais, simples de programar, flexıveis e eficientes que operam sobremonoides. Contudo, infelizmente um estudo padrao sobre estas arvores nao cabe aqui porque suas estruturas geraistiveram de ser enormemente modificadas para que elas fossem utilizaveis nos problemas que iremos resolver. Dessaforma apresentaremos duas versoes destas estruturas de dados voltadas especificamente aos problemas CCMR eAUR.

Antes, no entanto, gostarıamos de descrever a estrutura geral das arvores de segmentos. Arvores de segmentos saoformadas por um numero fixo m de folhas e m − 1 nos internos, cada um com exatamente dois filhos. Ainda, hauma restricao de que m deve ser uma potencia de 2, digamos m = 2k para algum k ∈ N. Podemos denominar oselementos da arvore por t1, t2, . . . , tm−1, tm, tm+1, . . . , t2m−1, onde os elementos t1, t2, . . . , tm−1 sao nos internos eos elementos tm, tm+1, . . . , t2m−1 sao folhas. Ainda, de acordo com o estudo de heaps realizado em [3], o pai de umelemento ti com i 6= 1 e o elemento tb i2c e os filhos do elemento ti com i < m sao os elementos t2i e t2i+1. Finalmente,quando nos referirmos ao intervalo determinado por um elemento ti, estamos nos referindo ao conjunto contıguo

14

Page 15: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Ii dos ındices das folhas que tem como ancestral o no ti menos m. Especificamente, o intervalo determinado pelono ti e o conjunto

Ii =[m(i− 2h)

2h..m(i+ 1− 2h)

2h− 1],

onde h e a altura do elemento ti (sua distancia ate a raiz da arvore). Os extremos deste intervalo sao numerosinteiros porque 2h divide m = 2k, sendo k a altura das folhas.

A figura 4 ilustra uma arvore de segmentos.

1

2 3

4 5 6 7

8 9 10 11 12 13 14 15

Figura 4: Uma arvore de segmentos com m = 8.

4.6.2 Arvores de Segmentos para o Problema CCMR

A arvore de segmentos que iremos utilizar para resolver o problema CCMR e uma estrutura de dados que guardaintervalos de numeros inteiros. Em virtude da nossa compressao de coordenadas no eixo y dos retangulos da entrada,podemos assumir que estes intervalos de numeros inteiros tem extremos no intervalo [0..2n−1]. Na realidade, devidoa forma das arvores de segmentos, iremos assumir apenas que eles tem extremos no intervalo [0..2k−1], onde k ∈ Ne o menor numero natural tal que m = 2k > 2n.

Inicialmente vamos estabelecer qual a invariante que nossa arvore de segmentos deve seguir.

Definicao 15. Uma arvore de segmentos t1, t2, . . . tm−1, tm, tm+1, . . . , t2m−1 e correta com respeito a lista S deintervalos de numeros inteiros com extremos no intervalo [0..m− 1] se

• A cada no ti estiverem associados valores ci,mi ∈ N.

• Se definirmos Σ(i) comodlog2(i+1)e−1∑

w=0

cb i2w c,

entao, para cada folha ti, i > m, Σ(i) = ρZS(i−m).

• Para cada no ti, mi = maxj∈Ii

ρZS(j)

− Σ(i).

Intuitivamente, uma arvore de segmentos e correta com respeito a S se, para cada folha, a soma dos valores ci nocaminho da raiz ate a folha (incluindo ambos) e o numero de intervalos em S que cobrem a coordenada da folhae, para cada no ti, mi e o numero de intervalos que cobrem a coordenada mais coberta por intervalos em S nointervalo determinado pelo no menos a soma dos ci no caminho da raiz ate o no interno (incluindo ambos).

Um fato interessante e que na arvore nao fica registrada a lista S: ela apenas e nossa referencia de quais intervalosforam inseridos mas nao removidos da estrutura. Este fato e de suma importancia e esta resumido no seguinteresultado.

Lema 1. Sejam S e S′ duas listas de intervalos de numeros inteiros de extremos em [0..m− 1] com a propriedadede que ρZS(i) = ρZS′(i) para todo i ∈ [0..m− 1]. Entao uma arvore de segmentos t1, t2, . . . tm−1, tm, tm+1, . . . , t2m−1

e correta com relacao a S se, e somente se, ela for correta com relacao a S′.

15

Page 16: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Demonstracao. Trivial, pois a invariante e expressa apenas em termos de ρZS(i) para coordenadas i ∈ [0..m−1].

Do jeito que a invariante foi proposta, podemos inicializar esta arvore de segmentos para que ela fique correta emrelacao a lista vazia simplesmente fazendo ci = mi = 0 para todos os valores de i ∈ [1..2m− 1]. Ja para adicionarou remover segmentos, precisamos primeiro definir a seguinte subrotina.

CCMR-Auxiliar(r, i, j, a, b, δ) :1 se a 6 b ent~ao2 se a = i ∧ b = j − 1 ent~ao3 cr ← cr + δ4 sen~ao5 k ← i+j

26 CCMR-Auxiliar(2r, i, k, a,minb, k − 1, δ)7 CCMR-Auxiliar(2r + 1, k, j,maxa, k, b, δ)8 mr ← maxm2r + c2r,m2r+1 + c2r+1

Com este procedimento, que iremos discutir logo em seguida, podemos implementar a insercao e a remocao naarvore de segmentos como segue.

CCMR-Insere(a, b):1 CCMR-Auxiliar(1, 0,m, a, b, 1)

CCMR-Remove(a, b):2 CCMR-Auxiliar(1, 0,m, a, b,−1)

Dedicaremos o restante desta secao a demonstrar que os procedimentos acima estao corretos e a mostrar comoimplementar as linhas 13 e 17 de Celula-de-Maior-Cobertura eficientemente. A analise de complexidade delessera deixada para depois, visto que a estrutura dos algoritmos analogos para o problema AUR e muito parecida ecompensa unificarmos as demonstracoes.

Teorema 7. Sejam t1, t2, . . . , tm−1, tm, tm+1, . . . , t2m−1 uma arvore de segmentos correta em relacao a uma listaS de intervalos de numeros inteiros com extremos em [0..m − 1], r ∈ [1..2m − 1], [i..j − 1] = Ir e [a..b] ⊆ Ir.Entao, apos uma execucao de CCMR-Auxiliar(r, i, j, a, b, 1), a arvore de segmentos estara correta em relacao alista S mais uma copia do intervalo [a..b] exceto por valores de mα com tα ascendente estrito de tr, isto e, podemosmodificar estes valores de forma que a arvore fique correta. Ainda, se a lista S contiver uma copia do intervalo [a..b],apos uma execucao de CCMR-Auxiliar(r, i, j, a, b,−1), se todos os valores de ci com i ∈ [1..2m− 1] terminaremnao-negativos, entao a arvore de segmentos resultante estara correta com relacao a lista S menos uma copia dointervalo [a..b] exceto tambem pelos valores de mα com tα ascendente estrito de tr, isto e, podemos modificar estesvalores de forma que a arvore fique correta.

Demonstracao. A prova sera por inducao em r, mas esta sera uma inducao ligeramente diferente do usual. Iremosassumir que o resultado vale para todo r′ > r e iremos prova-lo para r, sem casos base.

Para tal, considere uma execucao de CCMR-Auxiliar(r, i, j, a, b, δ) onde r ∈ [1..2m−1], [i..j−1] = Ir, [a..b] ⊆ Ir,δ ∈ −1, 1 e, caso δ = −1, existe uma copia de [a..b] na lista S. Se [a..b] = , a insercao ou remocao de umacopia deste intervalo nao surte qualquer efeito sobre o valor de ρZS(x) para qualquer coordenada x ∈ [0..m − 1], eportanto, pelo lema 1, a invariante e mantida caso simplesmente nao facamos nada. Mas como a > b, temos que acondicao na linha 1 de CCMR-Auxiliar nao e satisfeita, e de fato o algoritmo nao faz nada. Inclusive, a arvoreresultante e correta mesmo sem alterar os valores de mα com tα ascendente estrito de tr.

Suponha entao que [a..b] 6= . A condicao na linha 1 sera satisfeita, o que nos permite assumir que o algoritmopassara entao pela linha 2. Se [a..b] = Ir = [i..j − 1], entao a = i e b = j − 1. Neste caso, com a insercaodeste intervalo todos os valores x em Ir terao ρZS(x) incrementado em 1, e, com sua remocao, todos estes valoresserao decrementados em 1. Assim sendo, como essas coordenadas sao precisamente as coordenadas cujas folhas saodescendentes (inclusive) de tr, e suficiente incrementar o valor de cr em δ. Mas e exatamente isto que o algoritmofaz, pois a condicao na linha 2 e satisfeita. Note que cr ficar negativo e um evento previsto pela hipotese indutiva.Agora note que se tα e descendente (inclusive) de tr, o valor de max

j∈Iα

ρZS(j)

e aumentado em δ, mas mα nao

16

Page 17: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

precisa ser alterado porque Σ(α) foi incrementado em δ ao mesmo tempo. Ja se tα e ascendente (exclusive) de tr, ovalor de mα pode estar comprometido, mas este efeito estava previsto na hipotese indutiva. Finalmente, se tα naoe ascendente nem descendente de tr, Ir ∩ Iα = , e assim mα continua valido, pois o caminho (inclusive) da raizate tα nao inclui tr.

Suponha agora que ⊂ [a..b] ⊂ [i..j− 1]. Note que caso isso ocorra, certamente r < m, pois do contrario #Ir = 1,o que contradiz ⊂ [a..b] ⊂ [i..j− 1]. A condicao na linha 2 falhara e, portanto, podemos assumir que o algoritmopassa pela linha 5. Seja entao k = i+j

2 = i+ j−i2 . Este valor e inteiro porque j− i = #Ir, uma potencia de 2 maior

que 1. Considere agora os dois intervalos A = [a.. minb, k − 1] e B = [maxa, k..b]. Claramente A ∩ B = e A ∪ B = [a..b]. Portanto, pelo lema 1, se ajustarmos a arvore (a menos de mα para tα ascendente (exclusive)de tr) de forma que ela fique correta em relacao a S mais os dois intervalos A e B, o mesmo ocorrera em relacaoa lista S mais [a..b]. De forma similar, como a arvore esta correta para S, ela esta correta para S menos umacopia de [a..b] mais A e B, e assim se, a tornarmos correta para esta lista menos A e B (novamente exceto paravalores de mα com tα ascendente estrito de tr), estaremos fazendo o mesmo em relacao a S menos [a..b]. Vamosentao mostrar que o algoritmo faz isso. De fato, o algoritmo chama CCMR-Auxiliar(2r, i, k, a,minb, k− 1, δ) eCCMR-Auxiliar(2r+1, k, j,maxa, k, b, δ), que, pela hipotese indutiva, faz algum ci ficar negativo (caso previstopela hipotese indutiva) ou torna a arvore correta a menos dos valores mα com tα ascendente (exclusive) de t2r out2r+1. Estes ascendentes, no entanto, sao os ascendentes (inclusive) de tr, pois tr e o pai de t2r e t2r+1. Se ovalor de mr estivesse correto, nada mais seria necessario. Mas podemos (possivelmente) corrigi-lo calculando-oexplicitamente. Temos

mr = maxj∈Ir

ρZS(j)

− Σ(r)

= maxj∈I2r∪I2r+1

ρZS(j)

−dlog2(r+1)e−1∑

w=0

cb r2w c

= max

maxj∈I2r

ρZS(j)

−dlog2(r+1)e−1∑

w=0

cb r2w c, max

j∈I2r+1

ρZS(j)

−dlog2(r+1)e−1∑

w=0

cb r2w c

= max

maxj∈I2r

ρZS(j)

− Σ(2r) + c2r, max

j∈I2r+1

ρZS(j)

− Σ(2r + 1) + c2r+1

= max m2r + c2r,m2r+1 + c2r+1 .

E e exatamente isto que o algoritmo faz (linha 8).

Corolario 1. Suponha que iniciemos com uma lista vazia e uma arvore de segmentos correta em relacao a estalista. Considere entao duas operacoes:

• Insercao: inserimos um intervalo [a..b] ⊆ [0..m− 1] em S e chamamos CCMR-Insere(a, b).

• Remocao: removemos uma copia de um intervalo [a..b] existente em S e chamamos CCMR-Remove(a, b).

Entao, se realizarmos qualquer quantidade de operacoes validas deste tipo uma apos a outra, a arvore de segmentosresultante estara correta em relacao a lista S resultante.

Demonstracao. Por inducao no numero de operacoes. Com zero operacoes, o resultado e trivial pois a arvore jainicia correta em relacao a lista.

Suponha entao que executemos uma insercao do intervalo [a..b]. Como CCMR-Insere(a, b) e uma mera chamadaa CCMR-Auxiliar(1, 0,m, a, b), t1 e a raiz da arvore, I1 = [0..m − 1] e [a..b] ⊆ I1, temos, pelo teorema 7, que aarvore resultante e correta em relacao a lista S mais o intervalo [a..b] a menos dos ascendentes (exclusive) de t1,que nao existem.

Suponha agora que exista uma copia do intervalo [a..b] em S e que executemos uma remocao de [a..b]. Como CCMR-Remove(a, b) e uma mera chamada a CCMR-Auxiliar(1, 0,m, a, b,−1), t1 e a raiz da arvore, I1 = [0..m − 1] e[a..b] ⊆ I1, temos que, pelo teorema 7, a arvore resultante ou contem algum ci < 0 ou ela esta correta em relacaoa nova lista a menos dos ancestrais (exclusive) da raiz, que nao existem. Resta mostrar que nunca ocorre ci < 0.A razao disso e que nenhuma decisao de fluxo de controle do algoritmo depende de δ, e assim os ındices dos ciincrementados durante a insercao de um intervalo sao precisamente os mesmos ındices dos ci decrementados durantea remocao do mesmo intervalo.

17

Page 18: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Para concluir esta secao, iremos mostrar como computar ρZS e alguem em σZS eficientemente se tivermos acesso a

uma arvore de segmentos correta com relacao a S. Por definicao, m1 =m−1maxi=0

ρZS(i)

− c1 = ρZS − c1 (pois ρZS(x) = 0

se x 6∈ [0..m− 1]). Assim m1 + c1 = ρZS .

Suponha agora que desejamos calcular alguem em σZS . Podemos rodar o seguinte algoritmo.

Alguem:1 r ← 12 while r < m do3 se c2r +m2r < c2r+1 +m2r+1 ent~ao4 r ← 2r + 15 sen~ao6 r ← 2r7 retorne r −m

Este algoritmo claramente roda em O(logm), pois em cada iteracao r e multiplicado por ao menos dois. Sua provade corretude segue.

Teorema 8. O algoritmo Alguem retorna algum elemento de σZS .

Demonstracao. Iremos provar a seguinte invariante em relacao ao loop da linha 2: o intervalo Ir contem alguemem σZS .

Inicialmente, Ir = [0..m− 1], e por isso a invariante comeca valida. Considere entao que ela valha numa passagemdo algoritmo pela linha 2. Vamos mostrar que se o algoritmo voltar a esta linha a invariante se mantem valida.

De fato, para o algoritmo retornar a linha 2 devemos ter r < m, e como Ir contem alguem em σZS , temos

ρZS = maxi∈Ir

ρZS(i)

= max

maxi∈I2r

ρZS(i)

, maxi∈I2r+1

ρZS(i)

.

Devemos mostrar que a nossa decisao de transformar r em ou 2r ou 2r + 1 maximiza a expressao acima. Mas

maxi∈I2r

ρZS(i)

< max

i∈I2r+1

ρZS(i)

⇐⇒

m2r + Σ(2r) < m2r+1 + Σ(2r + 1) ⇐⇒m2r + Σ(2r)− Σ(r) < m2r+1 + Σ(2r + 1)− Σ(r) ⇐⇒

m2r + c2r < m2r+1 + c2r+1,

e assim na linha 3 o algoritmo efetivamente empregra um criterio valido para decidir por qual filho seguir.

4.6.3 Arvores de Segmentos para o Problema AUR

Antes de mostrar como usar arvores de segmentos para resolver o problema AUR, iremos mostrar como usa-laspara resolver um problema ligeiramente diferente. Especificamente, serao dados n numeros inteiros w0, w1, . . . , wn−1

e pede-se para manter uma lista S de intervalos de numeros inteiros com extremos em [0..n − 1] suportando asoperacoes de insercao de uma copia de um intervalo, remocao de uma copia de um intervalo e o calculo do valor∑i∈A

wi, onde A =⋃

(a, b) em S

[a..b].

E simples verificar que podemos reduzir qualquer instancia deste problema a uma instancia onde n e uma potenciade dois. Para isso, procuramos o menor k natural tal que 2k > n e estendemos a lista w0, w1, . . . , wn−1 paraw0, w1, . . . , wm−1 onde m = 2k e os valores wn, wn+1, . . . , wm−1 sao escolhidos conforme desejado.

Sendo assim, iremos montar uma arvore de segmentos da forma t1, t2, . . . , tm−1, tm, tm+1, . . . , t2m−1. A invarianteque esta arvore de segmentos ira manter pode ser expressa atraves da seguinte definicao.

Definicao 16. Uma arvore de segmentos e correta com relacao a uma lista S de intervalos de numeros inteiroscom extremos em [0..m− 1] se

18

Page 19: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

• A cada no estiverem associados valores ci, si ∈ N.

• Definindo

Σ(i) =dlog2(i+1)e−1∑

w=0

cb i2w c,

e verdade que, para cada folha ti, Σ(i) = ρZS(i−m).

• Para cada no ti,si =

∑j∈Ii

ρZS(j)>Σ(i)

wj .

Intuitivamente, a soma dos valores de ci em um caminho da raiz a qualquer folha deve ser o numero de intervaloscobrindo a coordenada daquela folha e si e nada mais do que a soma dos valores de wj onde j ∈ Ii e coberto pormais intervalos do que Σ(i).

Antes de continuarmos, cabe a seguinte definicao.

Definicao 17. As somas parciais de w0, w1, . . . , wn−1 sao os valores ∂0, ∂1, . . . , ∂n−1, ∂n definidos por

∂i =

0, i = 0∂i−1 + wi−1, i 6= 0.

E simples notar que os valores ∂0, ∂1, . . . , ∂n podem ser computados em O(n), e assim assumiremos, sem prejuızoao tempo de execucao do algoritmo, que as somas parciais ∂0, ∂1, . . . , ∂m de w0, w1, . . . , wm−1 ja foram calculadasantes de seu inıcio.

Note agora que se uma arvore e correta com relacao a lista S, podemos obter o valor desejado pelo problema daseguinte forma. Se c1 = 0, entao o conjunto dos valores cobertos por ao menos um intervalo de S e o conjunto dosvalores j com ρZS(j) > 0 e entao, por definicao, o valor desejado e s1. Por outro lado, se c1 6= 0, como o no t1 esta nocaminho para toda folha, ρZS(j) 6= 0 para toda coordenada j, e assim o valor desejado e ∂m = w0 +w1 + · · ·+wm−1.

Como na secao anterior, na arvore de segmentos nao e mantido nenhum registro de quais intervalos estao em S. Alista S e apenas uma nocao abstrata do que a arvore de segmentos deve representar. Este fato pode ser resumidono seguinte resultado.

Lema 2. Sejam S e S′ duas listas de intervalos de numeros inteiros com extremos em [0..m−1] com a propriedadede que ρZS(i) = ρZS′(i) para todo i ∈ [0..m− 1]. Entao uma arvore de segmentos t1, t2, . . . tm−1, tm, tm+1, . . . , t2m−1

e correta com relacao a S se, e somente se, ela for correta com relacao a S′.

Demonstracao. A definicao de corretude de uma arvore de segmentos e expressa apenas em termos de ρZS(i) paracoordenadas i ∈ [0..m− 1].

Uma arvore de segmentos correta em relacao a lista vazia pode ser obtida fazendo ci = si = 0 para todo no ti. Japara definir o algoritmo que nos possibilitara inserir e remover intervalos da arvore, precisamos de uma subrotinaauxiliar.

19

Page 20: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

AUR-Auxiliar(r, i, j, a, b, δ):1 se a 6 b ent~ao2 se a = i ∧ b = j − 1 ent~ao3 cr ← cr + δ4 sen~ao5 k ← i+j

26 AUR-Auxiliar(2r, i, k, a,minb, k − 1, δ)7 AUR-Auxiliar(2r + 1, k, j,maxa, k, b, δ)8 sr ← 09 se c2r = 0 ent~ao

10 sr ← sr + s2r

11 sen~ao12 sr ← sr + (∂k − ∂i)13 se c2r+1 = 0 ent~ao14 sr ← sr + s2r+1

15 sen~ao16 sr ← sr + (∂j − ∂k)

Com ela podemos definir as rotinas de insercao e remocao de intervalos da arvore de segmentos.

AUR-Insere(a, b) :1 AUR-Auxiliar(1, 0,m, a, b, 1)

AUR-Remove(a, b) :1 AUR-Auxiliar(1, 0,m, a, b,−1)

Como no algoritmo para CCMR, trataremos da complexidade destas rotinas adiante, na proxima secao. Agorairemos nos limitar a mostrar que eles funcionam corretamente e que e possıvel reduzir o problema AUR ao problemaque viemos tratando. Continuemos com o seguinte resultado.

Teorema 9. Sejam t1, t2, . . . , tm−1, tm, tm+1, . . . , t2m−1 uma arvore de segmentos correta com relacao a uma listaS de intervalos de numeros inteiros com extremos em [0..m−1], r ∈ [1..2m−1], [i..j−1] = Ir e [a..b] ⊆ Ir. Entao,apos uma execucao de AUR-Auxiliar(r, i, j, a, b, 1), a arvore de segmentos estara correta em relacao a lista S maiso intervalo [a..b], exceto possivelmente para valores de sα com tα ascendente estrito de tr, isto e, podemos alterarestes valores de forma que a arvore fique correta. Ainda, se a lista S contiver uma copia do intervalo [a..b], aposuma execucao de AUR-Auxiliar(r, i, j, a, b,−1), existira algum ci < 0 com i ∈ [1..2m − 1] ou entao a arvore desegmentos resultante estara correta com relacao a lista S menos uma copia do intervalo [a..b], exceto possivelmentepor valores de sα com tα ascendente estrito de tr, isto e, podemos modificar estes valores de forma que a arvorefique correta.

Demonstracao. Esta demonstracao sera completamente analoga a do teorema 7. Ela sera por inducao em r, ondeassumimos que o resultado vale para todos os valores de r maiores do que um certo r0 e provamos que ele tambemvale para r0.

Sendo assim, considere uma execucao de AUR-Auxiliar(r, i, j, a, b, δ) onde r ∈ [1..2m−1], [i..j−1] = Ir, [a..b] ⊆ Ir,δ ∈ −1, 1 e, caso δ = −1, existe uma copia de [a..b] em S. Se [a..b] = , entao a insercao ou remocao desteintervalo nao altera ρZS(x) para nenhum x ∈ [0..m − 1] e assim, pelo lema 2, podemos simplesmente nao realizaracao alguma para tornar a arvore correta. Mas e justamente isto que o algoritmo faz, pois a condicao na linha 1falha.

Suponha entao que [a..b] 6= . Assim a condicao na linha 1 e aceita e o algoritmo passa para a linha 2. Se[a..b] = Ir ⇐⇒ a = i ∧ b = j − 1, entao a insercao deste intervalo incrementa ρZS(x) para todo x ∈ Ir e,similarmente, sua remocao decrementa ρZS(x) para todo x ∈ Ir. Assim, no que diz respeito aos valores dos ci, esuficiente incrementar cr em δ. Mas e justamente isto que o algoritmo faz na linha 3, visto que a condicao na linha2 e satisfeita. Note que se cr terminar negativo, nao ha problema, pois isto e previsto na hipotese indutiva. Se tαe descendente (inclusive) de tr, entao tanto ρZS(x) com x ∈ Iα ⊆ Ir e Σ(α) sao incrementados em δ, fazendo comque sα continue valido. Se tα e um ascendente estrito de tr, o valor de sα pode ficar errado, mas isso e previsto na

20

Page 21: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

hipotese indutiva. Finalmente, se tα nao e ascendente nem descendente de tr, o caminho da raiz ate tα nao incluitr e Iα ∩ Ir = , de forma que sα nao precisa ser alterado.

Por fim suponha que ⊂ [a..b] ⊂ Ir. Se isso ocorre, certamente r < m, pois do contrario #Ir = 1. A condicao nalinha 2 falhara e assim o algoritmo passara pela linha 5. Seja entao k = i+j

2 = i + j−i2 , que e um numero inteiro

pois j − i = #Ir, uma potencia de 2 maior do que 1. Considere assim os dois intervalos A = [a.. minb, k − 1] eB = [maxa, k..b] que claramente satisfazem A ∩ B = e A ∪ B = [a..b]. Portanto, pelo lema 2, se tornarmosa arvore (a menos de sα com tα ascendente estrito de tr) correta com relacao a S mais A e B, estaremos fazendoo mesmo com relacao a S. De forma similar, se δ = −1, a arvore estara correta em relacao a S (que contem umacopia de [a..b]) e portanto ela tambem esta correta em relacao a lista obtida removendo [a..b] de S e adicionandoA e B. Assim, se ajustarmos a arvore (a menos de sα com tα ascendente estrito de tr) de forma que ela fiquecorreta com relacao a esta lista menos A e B, estaremos fazendo o mesmo em relacao a S menos [a..b]. Mas oalgoritmo chama AUR-Auxiliar(2r, i, k, a,minb, k − 1, δ) e AUR-Auxiliar(2r + 1, k, j,maxa, k, b, δ), o que,pela hipotese indutiva, faz algum ci ficar negativo (evento previsto na hipotese indutiva) ou torna a arvore correta amenos de valores sα para ascendentes estritos tα de t2r ou t2r+1, que sao os ascendentes (inclusive) de tr. Portanto,se pudermos (possivelmente) corrigir sr nao ha mais nada a fazer. Mas note que

sr =∑j ∈ Ir

ρZS(j) > Σ(r)

wj

=∑

j ∈ I2rρZS(j) > Σ(r)

wj +∑

j ∈ I2r+1

ρZS(j) > Σ(r)

wj

=

j ∈ I2rρZS(j) > Σ(2r)

wj , Σ(r) = Σ(2r)

∂k − ∂i, senao

+

j ∈ I2r+1

ρZS(j) > Σ(2r + 1)

wj , Σ(r) = Σ(2r + 1)

∂j − ∂k, senao

=s2r, c2r = 0∂k − ∂i, senao +

s2r+1, c2r+1 = 0∂j − ∂k, senao.

E e precisamente este calculo que o algoritmo faz (linhas 8 a 16).

Talvez caiba dizer que∑

j ∈ I2rρZS(j) > Σ(r)

wj =∑j∈I2r

wj = ∂k−∂i se c2r 6= 0 porque como Σ(2r) > Σ(r), ρZS(j) > Σ(2r) >

Σ(r) para todo j ∈ I2r. O analogo vale para a outra soma por uma razao similar.

Corolario 2. Suponha que iniciemos com uma lista vazia e uma arvore de segmentos correta em relacao a estalista. Considere entao duas operacoes:

• Insercao: inserimos um intervalo [a..b] ⊆ [0..m− 1] em S e chamamos AUR-Insere(a, b).

• Remocao: removemos uma copia de um intervalo [a..b] existente em S e chamamos AUR-Remove(a, b).

Entao, se realizarmos qualquer quantidade de operacoes validas deste tipo uma apos a outra, a arvore de segmentosresultante estara correta em relacao a lista S resultante.

Demonstracao. Por inducao no numero de operacoes. Se nenhuma operacao for realizada, o resultado e trivialporque a arvore inicial e correta com relacao a lista inicial.

Suponha entao que executemos uma insercao do intervalo [a..b]. Como AUR-Insere(a, b) e uma mera chamada aAUR-Auxiliar(1, 0,m, a, b), t1 e a raiz da arvore, I1 = [0..m−1] e [a..b] ⊆ I1, temos, pelo teorema 9, que a arvoreresultante e correta em relacao a lista S mais o intervalo [a..b] a menos dos ascendentes (exclusive) de t1, que naoexistem.

Suponha agora que exista uma copia do intervalo [a..b] em S e que executemos uma remocao de [a..b]. ComoAUR-Remove(a, b) e uma mera chamada a AUR-Auxiliar(1, 0,m, a, b,−1), t1 e a raiz da arvore, I1 = [0..m− 1]e [a..b] ⊆ I1, temos que, pelo teorema 9, a arvore resultante ou contem algum ci < 0 ou ela esta correta em relacaoa nova lista a menos dos ancestrais (exclusive) da raiz, que nao existem. Resta mostrar que nunca ocorre ci < 0.

21

Page 22: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

A razao disso e que nenhuma decisao de fluxo de controle do algoritmo depende de δ, e assim os ındices dos ciincrementados durante a insercao de um intervalo sao precisamente os mesmos ındices dos ci decrementados durantea remocao do mesmo intervalo.

Agora que sabemos resolver este problema, vamos mostrar como reduzir o problema AUR a ele. Podemos assumirque os eventos que ocorrem no problema AUR tem ordenadas em [0..p− 1], onde p = # Im(ϕ), 0 6 p 6 2n, devidoa compressao de coordenadas (ϕ, ξ) para as ordenadas dos eventos. Sejam entao w0, w1, . . . , w2p−2 definidos porw2i = 1 para i ∈ [0..p − 1] e w2i+1 = ξ(i + 1) − ξ(i) − 1 para i ∈ [0..p − 2]. De acordo com o que foi visto nestasecao, manteremos a arvore de segmentos t1, t2, . . . , tm−1, tm, tm+1, . . . , t2m−1 (onde m = 2k e a menor potenciade 2 maior ou igual a 2p − 1) em relacao aos valores w0, w1, . . . , w2p−2. Quando um intervalo da forma (a, b) forinserido em S na linha 7 ou removido de S na linha 9 de Area-da-Uniao-de-Retangulos, saberemos, visto quecomprimimos coordenadas, os ındices i e j das coordenadas de a e b, respectivamente. Neste casos iremos inserirou remover, respectivamente, o intervalo [2ϕ(i)..2ϕ(j)] na nossa arvore de segmentos.

Para entender por que o problema foi reduzido, considere os seguintes resultados.

Lema 3. Sejam a, b ∈ [0..p− 1]. Entao

2b∑i=2a

wi = #[ξ(a)..ξ(b)] = ξ(b)− ξ(a) + 1.

Demonstracao. A prova sera por inducao em b − a. Se b − a = 0, entao a = b e consequentemente a soma valew2i = 1 = ξ(b)− ξ(a) + 1, pois ξ(b)− ξ(a) = 0. Ja se a < b, temos

2b∑i=2a

wi = w2a + w2a+1 +2b∑

i=2(a+1)

wi

= 1 + ξ(a+ 1)− ξ(a)− 1 + ξ(b)− ξ(a+ 1) + 1= ξ(b)− ξ(a) + 1.

Corolario 3. Seja S = [I0, I1, . . . , Ik−1] uma lista de intervalos onde Ij = [ξ(a2j)..ξ(a2j+1)] para determinadosvalores de a2j e a2j+1, 0 6 a2j , a2j+1 < p e j ∈ [0..k − 1]. Seja S′ = [I ′0, I

′1, . . . , I

′k−1] a lista de intervalos definida

por I ′j = [2a2j..2a2j+1]. Entao

#⋃

(a, b) emS

[a..b] =∑

i∈⋃

(a, b) emS′

[a..b]

wi.

Demonstracao. Como o conjunto A =⋃

(a, b) emS

[a..b] e uma uniao de intervalos com extremos em Im(ξ), para cada

ponto x ∈ A\ Im(ξ), podemos escolher pontos ξ(ix), ξ(ix+1) ∈ Im(ξ) satisfazendo x ∈ [ξ(ix)+1..ξ(ix+1)−1] ⊆ A.Dessa forma podemos definir o conjunto de intervalos X = [ξ(ix) + 1..ξ(ix + 1) − 1] : x ∈ A \ Im(ξ). Portanto,como os elementos em X sao disjuntos, estao contidos em A e englobam todos os elementos em A \ Im(ξ),

#A = #(A ∩ Im(ξ)) + #(A ∩ (Z \ Im(ξ)))

= #(A ∩ Im(ξ)) +∑I∈X

#(A ∩ I)

= #(A ∩ Im(ξ)) +∑I∈X

#I.

Agora, se x ∈ A ∩ Im(ξ), entao x = ξ(yx) para um unico yx ∈ [0..p − 1]. Como x ∈ A, x ∈ [ξ(a2j)..ξ(a2j+1)] paraalgum [ξ(a2j)..ξ(a2j+1)] em S. Mas x ∈ [ξ(a2j)..ξ(a2j+1)] =⇒ ξ(a2j) 6 ξ(yx) 6 ξ(a2j+1) =⇒ a2j 6 yx 6 a2j+1 =⇒2a2j 6 2yx 6 2a2j+1 =⇒ 2yx ∈ [2a2j ..2a2j+1], que e um intervalo em S′. Portanto 2yx esta em B ∩ P , ondeB =

⋃(a, b) em S′

[a..b] e P e o conjunto dos inteiros pares.

22

Page 23: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Defina entao f : A ∩ Im(ξ) → B ∩ P por f(x) = 2yx. f e certamente injetiva porque 2yx = 2yx′ =⇒ yx =yx′ =⇒ ξ(yx) = ξ(yx′) =⇒ x = x′. Por outro lado, se 2y ∈ B ∩ P , entao existe [2a2j ..2a2j+1] em S′ tal que2y ∈ [2a2j ..2a2j+1] =⇒ 2a2j 6 2y 6 a2j+1 =⇒ a2j 6 y 6 a2j+1 =⇒ ξ(a2j) 6 ξ(y) 6 ξ(a2j+1) =⇒ ξ(y) ∈[ξ(a2j)..ξ(a2j+1)]. Mas como [2a2j ..2a2j+1] esta em S′, [ξ(a2j)..ξ(a2j+1)] esta em S e entao ξ(y) ∈ A ∩ Im(ξ). Masf(ξ(y)) = 2y, e assim concluımos que f e sobrejetora. Assim, f e bijetiva e os conjuntos A∩ Im(ξ) e B∩P possuema mesma cardinalidade.

Ainda, se I ∈ X e I 6= , existem ξ(i), ξ(i+ 1) tais que I = [ξ(i) + 1..ξ(i+ 1)−1]. Ha entao Ij em S tal que I ⊆ Ij ,de forma que ξ(a2j) 6 ξ(i) < ξ(i + 1) 6 ξ(a2j+1) =⇒ a2j 6 i < a2j+1 =⇒ 2a2j 6 2i < 2a2j+1, o que mostra que2i+ 1 ∈ [2a2j ..2a2j+1], que esta em S′. E note que w2i+1 = ξ(i+ 1)− ξ(i)− 1 = #I.

Conversamente, se 2i+ 1 ∈ [2a2j ..2a2j+1] com este ultimo intervalo em S′, o intervalo [ξ(a2j)..ξ(a2j+1)] esta em S,e 2a2j < 2i + 1 < 2a2j+1 =⇒ 2a2j 6 2i < 2i + 1 < 2a2j+1 =⇒ a2j 6 i < a2j+1 =⇒ ξ(a2j) 6 ξ(i) < ξ(a2j+1) =⇒ξ(a2j) 6 ξ(i) + 1 6 ξ(a2j+1). Por causa disto, ou ξ(i) + 1 6∈ Im(ξ) e o intervalo I = [ξ(i) + 1..ξ(i+ 1)− 1] 6= estaem X, ou ξ(i) + 1 = ξ(i+ 1) e #I = ξ(i+ 1)− ξ(i)− 1 = w2i+1 = 0. Assim concluımos que∑

I∈X#I =

∑2i+1∈B∩(Z\P )

w2i+1.

Como w2i = 1 para todo 2i ∈ B ∩ P , temos

#A = #(A ∩ Im(ξ)) +∑I∈X

#I

= #(B ∩ P ) +∑

2i+1∈B∩(Z\P )

w2i+1

=∑

2i∈B∩Pw2i +

∑2i+1∈B∩(Z\P )

w2i+1

=∑i∈B

wi

=∑

i∈⋃

(a, b) emS′

[a..b]

wi,

como desejavamos.

O que esses resultados nos mostram e que uma consulta da forma #⋃

(a, b) emS

[a..b] pode ser reduzida a uma consulta

da forma∑

i∈⋃

(a, b) emS′

[a..b]

wi, a qual estamos perfeitamente aptos a responder. Dessa forma o problema foi reduzido

com sucesso.

4.6.4 Analise de Complexidade

Considere o seguinte procedimento.

Essencial(r, i, j, a, b):1 se a 6 b ∧ (a 6= i ∨ b 6= j − 1) ent~ao2 k ← i+j

23 Essencial(2r, i, k, a,minb, k − 1)4 Essencial(2r + 1, k, j,maxa, k, b)

Intuitivamente, este procedimento possui um fluxo de controle similar ao de CCMR-Auxiliar e AUR-Auxiliar.Mais precisamente, nos tres procedimentos, se descontarmos o tempo gasto durante a execucao de uma chamadarecursiva, o tempo de execucao e O(1), de forma que se pudermos mostrar que os tres procedimentos fazem o

23

Page 24: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

mesmo numero de chamadas de funcao, e suficiente analisar o tempo de execucao de Essencial, pois os tempos deexecucao de CCMR-Auxiliar e AUR-Auxiliar serao os mesmos.

Lema 4. Sejam r ∈ [1..2m−1], [i..j−1] = Ir e [a..b] ⊆ Ir. Entao os procedimentos CCMR-Auxiliar(r, i, j, a, b, δ),AUR-Auxiliar(r, i, j, a, b, δ) e Essencial(r, i, j, a, b) fazem o mesmo numero de chamadas de funcoes em suasexecucoes para qualquer valor de δ ∈ −1, 1.

Demonstracao. A prova e por inducao em r. Assumindo que ele vale para valores de r maiores que um certo r0,provaremos o resultado para r0.

Para qualquer que seja r, se [a..b] = ou [a..b] = Ir e simples verificar que os tres algoritmos nao fazem nenhumachamada recursiva. Isso e feito simplesmente verificando as condicoes nos tres.

Se ⊂ [a..b] ⊂ Ir, os tres algoritmos irao fazer chamadas recursivas a si mesmos nas forma (2r, i, k, a,minb, k−1)e (2r+1, k, j,maxa, k, b) (com o parametro δ adicional se o algoritmo nao for Essencial). Como r < 2r < 2r+1, ahipotese indutiva nos diz que nessas duas instancias o numero de execucoes dos tres algoritmos e o mesmo e portantoo numero total de chamadas (a soma do numero total de chamadas nessas instancias mais 2), e o mesmo nos tresalgoritmos.

Da mesma forma, como Essencial(r, i, j, a, b) roda em O(1) se descontarmos o tempo gasto em chamadas recur-sivas, se mostrarmos que ele faz O(log #Ir) dessas chamadas, estaremos mostrando que ele roda em O(log #Ir).Provaremos isto agora.

Lema 5. Sejam r ∈ [1..2m − 1], [i..j − 1] = Ir e [a..b] ⊆ Ir. Entao, se a = i, o algoritmo Essencial(r, i, j, a, b)faz no maximo 2 log #Ir chamadas recursivas.

Demonstracao. A prova sera por inducao em r (assumiremos que o resultado vale para todo r > r0 e provaremosque ele vale tambem para r0).

Se [a..b] = ou [a..b] = [i..j − 1], claramente nenhuma chamada e realizada. Ja se ⊂ [a..b] ⊂ [i..j − 1], temosdois casos: b < k e b > k. Se b < k, a segunda chamada (da forma Essencial(2r + 1, k, j,maxa, k, b)) sera feitacom um intervalo vazio, nao fazendo nenhuma chamada recursiva. Entao o numero de chamadas recursivas e 2mais o numero de chamadas recursivas feitas por Essencial(2r, i, k, a,minb, k − 1), que pela hipotese indutiva emenor ou igual a 2 log #I2r. Portanto o total de chamadas recursivas e menor ou igual a

2 + 2 log #I2r = 2 + 2(log #Ir − 1) = 2 log #Ir.

Similarmente, se b > k, a primeira chamada (da forma Essencial(2r, i, k, a,minb, k − 1)) sera feita com umintervalo igual a I2r, e portanto nao ira produzir nenhuma chamada recursiva. Como o numero total de chamadasrecursivas produzidas pela segunda chamada e, pela hipotese indutiva, menor ou igual a 2 log #I2r+1, temos que onumero total de chamadas recursivas produzidas e menor ou igual a

2 + 2 log #I2r+1 = 2 + 2(log #Ir − 1) = 2 log #Ir,

o que prova o resultado.

Lema 6. Sejam r ∈ [1..2m−1], [i..j−1] = Ir e [a..b] ⊆ Ir. Entao, se b = j−1, o algoritmo Essencial(r, i, j, a, b)faz no maximo 2 log #Ir chamadas recursivas.

Demonstracao. A demonstracao e totalmente analoga a do lema 5.

Teorema 10. Sejam r ∈ [1..2m− 1], [i..j − 1] = Ir e [a..b] ⊆ Ir. Entao o algoritmo Essencial(r, i, j, a, b) faz nomaximo 4 log #Ir chamadas recursivas.

Demonstracao. Como nos dois lemas anteriores, a demonstracao sera por inducao em r.

Se [a..b] = ou [a..b] = [i..j − 1], nenhuma chamada e feita. Ja se ⊂ [a..b] ⊂ [i..j − 1], temos tres casos:a 6 b < k, a < k 6 b e k 6 a 6 b.

24

Page 25: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Se a 6 b < k, o algoritmo faz duas chamadas recursivas, mas a segunda (da forma Essencial(2r+1, k, j,maxa, k, b))tera um intervalo vazio e nao produzira nenhuma chamada recursiva adicional, o que faz o total de chamadas re-cursivas ser igual a 2 mais o numero de chamadas recursivas feitas pela primeira chamada. Pela hipotese indutiva,isto e menor ou igual a

2 + 4(log #I2r+1) < 4 + 4(log #Ir − 1) = 4 log #Ir.

Se k 6 a 6 b, a primeira chamada recursiva (da forma Essencial(2r, i, k, a,minb, k − 1)) tambem tera umintervalo vazio e, de uma forma analoga a do caso acima, o resultado se verifica.

Finalmente, se a < k 6 b, o algoritmo tera duas chamadas, uma da forma Essencial(2r, i, k, a,minb, k − 1) eoutra da forma Essencial(2r + 1, k, j,maxa, k, b). Como b > k, minb, k − 1 = k − 1, e assim, pelo lema 6, aprimeira chamada faz no maximo 2 log #I2r chamadas recursivas. Como a < k, temos que maxa, k = k e assim,pelo lema 5, a segunda chamada faz no maximo 2 log #I2r+1 chamadas recursivas. Portanto, o total de chamadasrecursivas feitas pelo algoritmo e no maximo

2 + 2 log #I2r + 2 log #I2r+1 < 4 + 2(log #Ir − 1) + 2(log #Ir − 1)= 4 log #Ir

e assim o resultado se verifica.

Assim, como ja discutimos, Essencial(r, i, j, a, b) roda em O(log #Ir) e, portanto, CCMR-Auxiliar(r, i, j, a, b, δ)e AUR-Auxiliar(r, i, j, a, b, δ) tambem. Dessa forma, os algoritmos AUR-Insere, AUR-Remove, CCMR-Insere e CCMR-Remove rodam em O(log n). Com isso, os algoritmos Area-da-Uniao-de-Retangulos eCelula-de-Maior-Cobertura podem ser implementados em O(n log n), o principal resultado desta secao.

4.6.5 Implementacoes Iterativas

As implementacoes de CCMR-Auxiliar e AUR-Auxiliar sao recursivas, pois estes algoritmos chamam a simesmos durante sua execucao. Existem duas vantagens em ter implementacoes iterativas dos algoritmos queestudamos para trabalhar com arvores de segmentos. A primeira e que o custo de memoria adicional na suaexecucao cai de O(log n) (na versao recursiva) para O(1) (na versao iterativa) devido ao fato de que nao maisguardamos stack frames na pilha. Alem disso, a arquitetura dos processadores modernos funciona de forma maiseficiente na versao iterativa. Isso se deve a diversos fatores cuja complexidade foge ao escopo deste trabalho, maspodemos citar que o uso de um conjunto fixo de registradores durante a execucao do algoritmo e algo bastantefavoravel.

Sendo assim, nesta secao iremos mostrar como construir versoes iterativas destes algoritmos. A ideia para fazerisso vem da demonstracao do teorema 10. Nela, tivemos a oportunidade de observar que os algoritmos procedembasicamente em um unico fluxo de execucao enquanto a 6 b < k ou k 6 a 6 b e, quando e se a < k 6 b, ele bifurcasua execucao em uma chamada da forma b = j − 1 e outra chamada da forma a = i.

Tendo dito isto, aqui seguem implementacoes iterativas de dois algoritmos denominados CCMR-Iterativo e AUR-Iterativo. Chamando CCMR-Iterativo(a, b, δ) e AUR-Iterativo(a, b, δ), podemos inserir e remover intervalosnos problemas CCMR e AUR, respectivamente, dependendo do valor de δ (δ = 1 insere e δ = −1 remove). Estee o mesmo efeito de chamadas da forma CCMR-Insere(a, b), CCMR-Remove(a, b), AUR-Insere(a, b) e AUR-Remove(a, b).

25

Page 26: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

CCMR-Iterativo(a, b, δ):1 se a > b ent~ao2 retorne3 r, i, j ← 1, 0,m4 enquanto a 6= i ∨ b 6= j − 1 faca5 k ← i+j

26 se b < k ent~ao7 r, j ← 2r, k8 sen~ao se a > k ent~ao9 r, i← 2r + 1, k

10 sen~ao11 va para primeiro12 cr ← cr + δ13 r′, r ← r, 014 va para ajuste15 primeiro: r′, i′, j′ ← 2r, i, k16 while a 6= i′ faca

17 k′ ← i′+j′

218 se a > k′ ent~ao19 r′, i′ ← 2r′ + 1, k′

20 sen~ao21 c2r′+1 ← c2r′+1 + δ22 r′, j′ ← 2r′, k′

23 cr′ ← cr′ + δ24 va para ajuste25 segundo: r′, i′, j′ ← 2r + 1, k, j26 enquanto b 6= j′ − 1 faca

27 k′ ← i′+j′

228 se b < k′ ent~ao29 r′, j′ ← 2r′, k′

30 sen~ao31 c2r′ ← c2r′ + δ32 r′, i′ ← 2r′ + 1, k′

33 cr′ ← cr′ + δ34 r ← 035 ajuste: repita

36 r′ ←⌊r′

2

⌋37 se r′ = r ent~ao38 pare39 mr′ ← maxc2r′ +m2r′ , c2r′+1 +m2r′+140 se r 6= 0 ent~ao41 va para segundo

26

Page 27: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

AUR-Iterativo(a, b, δ):1 se a > b ent~ao2 retorne3 r, i, j ← 1, 0,m4 enquanto a 6= i ∨ b 6= j − 1 faca5 k ← i+j

26 se b < k ent~ao7 r, j ← 2r, k8 sen~ao se a > k ent~ao9 r, i← 2r + 1, k

10 sen~ao11 va para primeiro12 cr ← cr + δ13 r′, i′, j′, r ← r, i, j, 014 va para ajuste15 primeiro: r′, i′, j′ ← 2r, i, k16 while a 6= i′ faca

17 k′ ← i′+j′

218 se a > k′ ent~ao19 r′, i′ ← 2r′ + 1, k′

20 sen~ao21 c2r′+1 ← c2r′+1 + δ22 r′, j′ ← 2r′, k′

23 cr′ ← cr′ + δ24 va para ajuste25 segundo: r′, i′, j′ ← 2r + 1, k, j26 enquanto b 6= j′ − 1 faca

27 k′ ← i′+j′

228 se b < k′ ent~ao29 r′, j′ ← 2r′, k′

30 sen~ao31 c2r′ ← c2r′ + δ32 r′, i′ ← 2r′ + 1, k′

33 cr′ ← cr′ + δ34 r ← 035 ajuste: repita36 ımpar← r′ mod 2 = 137 r′ ←

⌊r′

2

⌋38 se r′ = r ent~ao39 pare40 se ımpar ent~ao41 i′, k′ ← 2i′ − j′, i′42 sen~ao43 j′, k′ ← 2j′ − i′, j′44 sr′ ← 045 se c2r′ = 0 ent~ao46 sr′ ← sr′ + s2r′

47 sen~ao48 sr′ ← sr′ + ∂k′ − ∂i′49 se c2r′+1 = 0 ent~ao50 sr′ ← sr′ + s2r′+1

51 sen~ao52 sr′ ← sr′ + ∂j′ − ∂k′53 se r 6= 0 ent~ao54 va para segundo

27

Page 28: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Devido ao tamanho da implementacao destes algoritmos, nao ofereceremos uma demonstracao formal de suascorretudes, mas faremos uma discussao informal de suas estruturas.

Ambos os algoritmos possuem quatro partes: o inıcio, a primeira bifurcacao, a segunda bifurcacao e o ajuste. Noinıcio, o algoritmo procede percorrendo a arvore enquanto o intervalo a ser inserido (ou removido) e um subconjuntode um intervalo de ordenadas de um dos filhos do no atual. Quando ele nao o for, ou ele cobre todo o intervalode ordenadas do no atual, caso no qual o algoritmo incrementa cr e procede para a secao de ajuste, ou ele podeser subdividido entre os intervalos de ordenadas de seus filhos. No primeiro caso, como setamos r = 0, a secao deajuste consertara todo o caminho do no ate a raız e terminara o algoritmo. No segundo caso, o algoritmo ira cuidarde suas duas bifurcacoes.

Na primeira bifurcacao, o algoritmo percorre a arvore inserindo (ou removendo) a primeira parte do intervalo esempre mantendo a invariante de que esta parte encosta na direita do intervalo de ordenadas do no atual. Estepasso para quando o intervalo encostar tambem na esquerda. Neste caso o loop e quebrado e cr′ e incrementado.Senao, se ele cobrir o intervalo de ordenadas do filho direito, incrementamos c2r′+1 para compensar e procedemospara o no esquerdo. Caso contrario avancamos para o no direito.

Apos o termino deste loop, o algoritmo precisa consertar os nos desde o pai de r′ ate a raiz, mas ele conserta,indo para o ajuste sem mexer em r, apenas os nos entre r′ e r (exclusive). Assim, o ajuste volta para a segundabifurcacao. Esta parte do codigo e precisamente analoga a primeira bifurcacao. Quando ela termina, precisamosajustar apenas os nos desde o pai de r′ ate a raiz. Mas ela seta r = 0 e vai para o ajuste, entao o algoritmo fazprecisamente isto.

O ajuste e a unica parte do codigo que difere substancialmente entre estes dois algoritmos. No caso de CCMR, elee bem direto, pois apenas atributos da arvore sao usados no conserto dos nos. Porem, no caso de AUR, precisamostambem indexar a tabela com as somas parciais pelos extremos (inclusivo a esquerda e exclusivo a direita) dosintervalos de coordenadas do no. Por isso precisamos corretamente propagar os valores de i′, j′ e k′ enquantosubimos na arvore. Se r′ e ımpar, ele e o filho a direita de seu pai e, se seu interavalo de coordenadas e [i′..j′− 1], ointervalo de coordenadas de seu pai e [2i′ − j′..j′ − 1]. Similarmente, se r′ e par, ele e o filho a esquerda de seu paie, se seu intervalo de coordenadas e [i′..j′ − 1], o intervalo de coordenadas de seu pai e [j′..2j′ − i′]. Note tambemque antes de, no ınicio do algoritmo, pularmos para o ajuste, precisamos inicializar i′, j′ e k′ alem de r′.

A complexidade deste algoritmo e claramente O(log n), pois o valor associado a condicao de termino dos loops (rou r′) e multiplicado por ao menos dois em loops descendentes e dividido por ao menos dois em loops ascendentes.

4.7 Alternativas as Arvores de Segmentos

Como pudemos observar e como foi dito na secao 4.6.1, arvores de segmentos sao estruturas gerais, de implementacaocurta (apenas uma rotina de algumas linhas de codigo), bastante flexıveis (resolvem os problemas AUR e CCMR,que sao de natureza relativamente diferente) e eficientes (custam O(log n) na realizacao das principais operacoes).Inclusive, a eficiencia dessa estrutura se limita nao so a sua complexidade assintotica, mas tambem ao seu usode recursos do hardware de maquinas modernas: ela nao guarda ponteiros, seus nos sao acessados com operacoesaritmeticas elementares (shifts e ors) e seu uso de memoria e compacto (um vetor) em vez de fragmentado comoum arvore dinamica tradicional.

Entretanto, ha um serio problema com as arvores de segmentos: elas nao se aplicam a versao on-line do problema,onde o numero de retangulos nao e conhecido de antemao (mas eles sao dados com as coordenadas x do lado esquerdoem ordem nao decrescente) e e pedida a area (ou um ponto de cobertura maxima) atras da linha determinada pelolado esquerdo do retangulo inserido em cada insercao. A razao disso e que essas arvores exigem uma compressaodas coordenadas do eixo y, o que so pode ser feito se todas elas forem conhecidas.

A estrutura de dados base para a implementacao das solucoes alternativas e a Arvore Rubro-Negra [4]. O metodopara a construcao da estrutura a que nos referimos esta em [5]. O problema CCMR foi deixado como exercıcioem [6]. Iremos indicar uma forma de resolver este exercıcio. Tambem iremos indicar um modo de adapta-lo aoproblema AUR. Para dar continuidade a esta secao, e necessario que o leitor leia estas referencias.

Daqui em diante, assumiremos que cada intervalo [a..b] guardado na arvore tera um no de entrada com coordenadaa e um no de saıda com coordenada b + 1. Ainda, iremos ordenar a arvore pelas coordenadas dos nos, resolvendoempates entre um no de entrada e um no de saıda colocando o no de saıda mais a esquerda na ordenacao.

Para resolver o problema CCMR, a arvore rubro negra sera aumentada guardando em cada no p os valores sp ∈ Z

28

Page 29: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

e mp ∈ N. Para cada no p, podemos listar os nos de sua subarvore atraves de uma in-order traversal (isto e, paratodo no, primeiro todos os nos na sua subarvore esquerda sao vistados, depois o no e vistado e finalmente todos osnos em sua subarvore direita sao visitados) para obter n0, n1, . . . , nk−1. Pelo fato de a arvore ser uma arvore binariade busca, as coordenadas desses nos estao em ordem nao decrescente (mas nos de saıda de mesma coordenada quenos de entrada aparecem primeiro). Iremos entao manter a invariante de que

sp =k−1∑i=0

δi

e

mp =k

maxi=0

i−1∑j=0

δj

,

onde δi e 1 se ni e um no de entrada e −1 se ele e um no de saıda.

Quando houver uma rotacao, iremos consertar a invariante como segue. Sejam n0, n1, . . . , nq−1, nq, nq+1, . . . , nk−1

os nos de uma in-order traversal de p, onde a subarvore de a, o filho a esquerda de p, possui in-order traversaln0, n1, . . . , nq−1, p = nq e a subarvore de b, o filho a direita de p, possui in-order traversal nq+1, . . . , nk−1. Clara-mente e suficiente fazer sp = sa + δq + sb, o que pode ser feito em O(1). Ja para ajustar mp, observe que o valormaximo e um dos dois valores

ma =q

maxi=0

i−1∑j=0

δj

ou sa + δq +mb =k

maxi=q+1

q∑j=0

δj +i−1∑

j=q+1

δj

.

Assim, mp = maxma, sa + δq +mb, o que tambem pode ser calculado em O(1).

A resposta para a pergunta de qual a quantidade de intervalos que cobre o ponto mais coberto e entao mr, onder e a raiz da arvore. Isto ocorre porque ao menos um ponto mais coberto esta num extremo esquerdo de algumintervalo e logo numa coordenada representada por um no de entrada na arvore. Se o no mais a direita satisfazendo

esta restricao e ni, sendo n0, n1, . . . , nk−1 uma in-order traversal de r, entao a somai∑

j=0

δj e exatamente o numero

de intervalos cobrindo o ponto, e assim mr e maior ou igual ao numero maximo de coberturas. Por outro lado, para

qualquer i, a somai∑

j=0

δj e menor ou igual ao numero de coberturas da coordenada do no ni (ou dessa coordenada

menos um caso ni seja um no de saıda), pois ni pode ser um no de saıda ou pode nao ser o ultimo no de entradanaquela coordenada. Assim, mr e menor ou igual ao numero maximo de coberturas.

Para resolver o problema AUR, tambem aumentaremos a arvore, mas dessa vez associaremos valores sp ∈ Z, mp ∈ Ze `p ∈ N a cada no p. Se n0, n1, . . . , nk−1 e uma in-order traversal da subarvore enraizada no no p, iremos mantera invariante de que

sp =k−1∑i=0

δi,

mp =k

mini=0

i−1∑j=0

δj

e

`p = # x ∈ [x0..xk−1] : O(x) 6= mp ,onde xi e a coordenada do no ni,

O(x) =ux−1∑i=0

δi

e ux e o ındice i do primeiro no ni cuja coordenada e maior do que x (ou k caso nao exista tal no).

Observe que O(x) > mp para qualquer x ∈ Z, pois O(x) e uma das somas parciais das quais mp e o mınimo.

Podemos, apos uma rotacao, consertar um no p = nq de in-order traversal n0, n1, . . . , nq−1, nq, nq+1, . . . , nk−1,subarvore esquerda a com in-order traversal n0, n1, . . . , nq−1 e subarvore direita b com in-order traversal nq+1, . . . , nk−1

29

Page 30: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

da seguinte maneira. Fazemos, como no problema CCMR, sp = sa + δq + sb em O(1). Tambem de forma simi-lar ao problema CCMR, fazemos mp = minma, sa + δq + mb em O(1). Finalmente consertarmos `p fazendo`p = S(I0)+S(I1)+S(I2)+S(I3), onde I0 = [x0..xq−1], I1 = [xq−1 +1..xq−1], I2 = [xq..xq+1−1], I3 = [xq+1..xk−1]e S(I) = # x ∈ I : O(x) 6= mp. Isto funciona porque os intervalos I0, I1, I2 e I3 sao disjuntos e tem como uniao[x0..xk−1]. Tudo o que resta entao e calcular S(I0), S(I1), S(I2) e S(I3) em O(1).

Se ma = mp entao, por definicao, S(I0) = `a. Ja se ma 6= mp, como mp = minma, sa + δq +mb 6 ma, ma > mp

e assim todo x ∈ I0 e tal que O(x) > ma > mp, de forma que S(I0) = #I0 = xq−1 − x0 + 1. Similarmente, casosa + δq +mb = mp, entao, se x ∈ I3 =⇒ ux > q + 1,

O(x) =ux−1∑i=0

δi =q∑i=0

δi +ux−1∑i=q+1

δi = sa + δq +O′(x),

onde O′(x) e o valor de O(x) com respeito a subarvore b. Portanto, neste caso S(I3) = `b. Se, no entanto,sa + δq +mb 6= mp, temos, analogamente que, S(I3) = #I3 = xk−1 − xq+1 + 1.

Se x ∈ I1, entao ux = q e assim O(x) = sa. Portanto, se sa = mp, S(I1) = 0 e se sa 6= mp, S(I1) = #I1 =xq − xq−1 − 1. Por outro lado, se x ∈ I2, ux = q + 1 e entao O(x) = sa + δq. Portanto, de forma similar sesa + δq = mp, S(I2) = 0 e caso contrario S(I2) = #I2 = xq+1 − xq.Temos entao uma forma de calcular `p em O(1) e portanto meios de implementar nossa estrutura alternativaeficientemente. O que falta mostrar e como obter o numero de elementos na uniao dos intervalos. Mas como emnenhum prefixo de uma in-order traversal da arvore completa podemos ter mais nos de saıda do que nos de entrada,mr = 0, onde r e a raiz da arvore. Assim, se O(x) = 0 = mr, temos que x ∈ Z nao esta coberto por nenhumintervalo e se O(x) 6= 0 = mp, temos que x esta coberto por algum intervalo. Isso e suficiente para concluir que oresultado desejado e `r.

5 Uma Reducao dos Problemas dos Diamantes aos dos Retangulos

Nesta secao iremos reduzir os problemas AUD e CCMD aos problemas AUR e CCMR, respectivamente. Iniciamoscom dois simples resultados.

Lema 7. Sejam A = [A0, A1, . . . , An−1] e B = [B0, B1, . . . , Bn−1] duas listas de subconjuntos finitos de Z2 com nelementos satisfazendo Ai ∩ Bj = para todos i, j ∈ [0..n − 1]. Defina C = [C0, C1, . . . , Cn−1] por Ci = Ai ∪ Bi,i ∈ [0..n− 1]. Entao

#n−1⋃i=0

Ci = #n−1⋃i=0

Ai + #n−1⋃i=0

Bi

eρZ2

C = maxρZ2

A , ρZ2

B

,

de forma que

σZ2

C =

σZ2

A , ρZ2

A > ρZ2

BσZ2

B , ρZ2

A < ρZ2

BσZ2

A ∪ σZ2

B , ρZ2

A = ρZ2

B .

Lema 8. Sejam A ⊆ Z2 e B ⊆ Z2 dois subconjuntos de Z2 e f : A → B uma funcao bijetiva de A em B. Sejaainda R = [R0, R1, . . . , Rn−1] uma lista de n subconjuntos finitos de A. Seja entao R′ = [R′0, R

′1, . . . , R

′n−1] a lista

de n subconjuntos finitos de B definida por R′i = Im(f,Ri) = f(p) : p ∈ Ri, i ∈ [0..n− 1]. Entao

#n−1⋃i=0

R′i = #n−1⋃i=0

Ri

eσZ2

R′ = Im(f, σZ2

R

)=f(p) : p ∈ σZ2

R

.

Para reduzir os problemas AUD e CCMD, iremos fazer o uso de uma transformacao que se assemelha, mas eessencialmente diferente, de uma rotacao no plano. Iremos definir esta transformacao agora e fazer um breve estudode suas propriedades.

30

Page 31: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Definicao 18. A funcao : Z2 → P sera definida por (x, y) = (x + y, x − y), onde P e o conjunto das celulas(x, y) ∈ Z2 tais que x+ y e par. Note que esta funcao esta bem definida porque (x+ y) + (x− y) = 2x, que e par.

Proposicao 2. A funcao e bijetiva.

Demonstracao. Primeiro provamos que e injetiva. Se (x, y) = (x′, y′), entao (x+ y, x− y) = (x′ + y′, x′ − y′)e assim x + y = x′ + y′ e x − y = x′ − y′. Somando essas duas equacoes nos da 2x = 2x′, e assim x = x′. Comox+ y = x′ + y′, x+ y = x+ y′ (pois x = x′) e assim y = y′.

Agora vamos mostrar que e sobrejetiva. Seja (x, y) ∈ Z2 tal que x + y e par. Entao x − y tambem e par(−y mod 2 = y mod 2). Assim,

(x+ y

2,x− y

2

)=(x+ y

2+x− y

2,x+ y

2− x− y

2

)= (x, y).

E interessante caracterizar a imagem de um diamante pela transformacao . Faremos isso agora.

Proposicao 3. Seja D = D((x0, y0), r) = (x, y) ∈ Z2 : |x− x0|+ |y − y0| 6 r um diamante. Entao

Im(, D) = ([x0 + y0 − r..x0 + y0 + r]× [x0 − y0 − r..x0 − y0 + r]) ∩ P.

Demonstracao. Mostraremos primeiro que Im(, D) ⊆ ([x0 + y0 − r..x0 + y0 + r]× [x0 − y0 − r..x0 − y0 + r])∩P .Seja (x, y) ∈ D((x0, y0), r). Entao |x − x0| + |y − y0| = |x − x0| + |y0 − y| 6 r. Mas pela desigualdade triangular,|x−x0|+ |y−y0| > |(x+y)− (x0 +y0)| e |x−x0|+ |y0−y| > |(x−y)− (x0−y0)|, e portanto |(x+y)− (x0 +y0)| 6 re |(x − y) − (x0 − y0)| 6 r. Assim x0 + y0 − r 6 x + y 6 x0 + y0 + r e x0 − y0 − r 6 x − y 6 x0 − y0 + r ou,alternativamente, (x, y) = (x+ y, x− y) ∈ [x0 + y0 − r..x0 + y0 + r]× [x0 − y0 − r..x0 − y0 + r].

Mostraremos agora que ([x0 + y0 − r..x0 + y0 + r]× [x0 − y0 − r..x0 − y0 + r]) ∩ P ⊆ Im(, D). Sejam x, y ∈ Ztais que x + y e par, x0 + y0 − r 6 x 6 x0 + y0 + r e x0 − y0 − r 6 y 6 x0 − y0 + r. Entao |x − (x0 + y0)| 6 r e|y − (x0 − y0)| 6 r. Como na demonstracao da proposicao 2, x+y

2 , x−y2 ∈ Z e (x+y

2 , x−y2

)= (x, y). E suficiente

entao mostrar que (x+y2 , x−y2 ) ∈ D, ou seja, que |x+y

2 − x0|+ |x−y2 − y0| 6 r. Mas∣∣∣∣x+ y

2− x0

∣∣∣∣+∣∣∣∣x− y2

− y0

∣∣∣∣ = max∣∣∣∣(x+ y

2− x0

)+(x− y

2− y0

)∣∣∣∣ , ∣∣∣∣(x+ y

2− x0

)−(x− y

2− y0

)∣∣∣∣= max |x− (x0 + y0)|, |y − (x0 − y0)|6 r.

Assim o resultado segue.

O formato da imagem de um diamante pode ser mais convenientemente representado como mostraremos a seguir.

Definicao 19. Sejam x0, y0 ∈ Z tais que x+ y e par e ` ∈ N. Definimos o quadriculado de tamanho ` e cantoinferior-esquerdo (x0, y0) como

Q((x0, y0), `) = ([x0..x0 + 2`]× [y0..y0 + 2`]) ∩ P.

Proposicao 4. Se (x0, y0) ∈ Z2 e r ∈ N, existem (x′0, y′0) ∈ P e ` ∈ N tais que Im(,D((x0, y0), r)) = Q((x′0, y

′0), `).

Demonstracao. Defina x′0 = x0 + y0 − r, y′0 = x0 − y0 − r e ` = r. Entao

Q((x′0, y′0), `) = ([x′0..x′0 + 2`]× [y′0..y′0 + 2`]) ∩ P

= ([x0 + y0 − r..x0 + y0 − r + 2r]× [x0 − y0 − r..x0 − y0 − r + 2r]) ∩ P= ([x0 + y0 − r..x0 + y0 + r]× [x0 − y0 − r..x0 − y0 + r]) ∩ P= Im(,D((x0, y0), r)).

31

Page 32: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Figura 5: Um diamante de raio 3 no grid e sua imagem pela funcao .

A figura 5 ilustra o que foi dito ate agora.

Devido ao lema 8, podemos reduzir os problemas AUD e CCMD aos problemas do calculo da area da uniao dequadriculados e do calculo de um ponto coberto por uma quantidade maxima de quadriculados em uma dada listade quadriculados, respectivamente. Iremos entao nos concentrar em reduzir estes problemas aos problemas AUR eCCMR, respectivamente.

Lema 9. Seja Q = Q((x0, y0), `) um quadriculado, (x0, y0) ∈ P e ` ∈ N. Defina as funcoes injetivas

f0 : Z2 −→ Z2

(x, y) 7−→ (2x, 2y) ef1 : Z2 −→ Z2

(x, y) 7−→ (2x+ 1, 2y + 1).

Entao existem retangulos A,B ⊆ Z2 tais que Im(f0, A) ∪ Im(f1, B) = Q.

Demonstracao. Seja X0 o conjunto dos pontos (x, y) ∈ Q com x par e X1 = Q \X0. Como todo ponto (x, y) ∈ X0

tem x par e X0 ⊆ Q ⊆ P , todo ponto (x, y) ∈ X0 tem y par. Assim X0 ⊆ Im(f0) = (x, y) ∈ Z2 : x e y sao pares.Portanto podemos definir o conjunto A como Im−1(f0, X0) = (x, y) ∈ Z2 : f0(x, y) ∈ X0 de forma que X0 =Im(f0, A). Similarmente, todo ponto (x, y) ∈ X1 deve possuir x e y ımpares, e assim X1 ⊆ Im(f1), de formaque podemos definir B = Im−1(f1, X1) = (x, y) ∈ Z2 : f1(x, y) ∈ X1 satisfazendo X1 = Im(f1, B). ComoX0 ∪X1 = Q, temos que Im(f0, A) ∪ Im(f1, B) = Q. Dessa forma, resta apenas mostrar que A e B sao retangulos.

De fato, se x0 e par, entao X0 = (x0 + 2i, y0 + 2j) : i, j ∈ [0..`] e X1 = (x0 + 2i+ 1, y0 + 2j+ 1) : i, j ∈ [0..`− 1].Isto segue da definicao de Q. Assim, temos que

A =(x0

2+ i,

y0

2+ j)

: i, j ∈ [0..`]

=[x0

2..x0

2+ `]×[y0

2..y0

2+ `].

Da mesma forma

B =(x0

2+ i,

y0

2+ j)

: i, j ∈ [0..`− 1]

=[x0

2..x0

2+ `− 1

]×[y0

2..y0

2+ `− 1

].

Analogamente, se x0 e ımpar,

A =(

x0 + 12

+ i,y0 + 1

2+ j

): i, j ∈ [0..`− 1]

=[x0 + 1

2..x0 + 1

2+ `− 1

]×[y0 + 1

2..y0 + 1

2+ `− 1

].

Similarmente

B =(

x0 − 12

+ i,y0 − 1

2+ j

): i, j ∈ [0..`]

=[x0 − 1

2..x0 − 1

2+ `

]×[y0 − 1

2..y0 − 1

2+ `

].

Por causa deste resultado, dada uma lista de quadriculados, podemos produzir duas listas de subconjuntos de Z2,uma cujos elementos estao contidos em Im(f0) e outra cujos elementos estao contidos em Im(f1), de forma que auniao de elementos correspondentes e o quadriculado corresponde. Mais ainda, atraves das transformacoes injetivasf0 e f1, podemos usar o lema 8 para reduzir o problema do calculo da area da uniao e de um ponto de coberturamaxima para cada uma das listas aos problemas AUR e CCMR. Finalmente, podemos usar o lema 7 para reduziro problema com quadriculados a AUR e CCMR.

32

Page 33: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

6 Implementacao em C

Esta secao descreve a implementacao que acompanha este trabalho. Esta implementacao consiste de um programaescrito inteiramente na linguagem de programacao C que e capaz de calcular a area da uniao e uma celula decobertura maxima em relacao a uma lista de diamantes.

O codigo fonte foi escrito em conformidade com os padroes C99 e GNU99 da linguagem C. Se o padrao GNU99 forutilizado para compila-lo, o compilador podera usufruir de anotacoes no codigo fonte que descrevem o comporta-mento de partes do programa e com isso otimiza-lo melhor.

O programa le sua entrada da entrada padrao. Esta entrada deve ser composta de um numero qualquer de casos deteste. Cada caso de teste e composto por uma linha contendo uma string de comando (composta pelos caracteres“r”, “x”, “y” e “a” sem repeticao) e um numero natural n e n linhas, cada uma contendo tres inteiros x, y e r,r > 0, descrevendo o diamante D((x, y), r). Apos a leitura destas linhas, o programa produz sua saıda para o casode teste. Esta saıda consiste de uma unica linha contendo um numero para cada caractere da string de comandodo caso de teste, em ordem. Se o caractere for “r”, o numero correspondente sera a quantidade de diamantes quecobrem a celula mais coberta. Se o caractere for “x”, o numero sera a coordenada x de uma celula do grid cobertapor uma quantidade maxima de diamantes. Se o caractere for “y”, o numero sera a coordenada y de uma celulado grid coberta por uma quantidade maxima de diamantes. Se o caractere for “a”, o numero sera a area da uniaodos diamantes. Ainda, se ambos os caracteres “x” e “y” estiverem presentes, as coordenadas impressas serao ascoordenadas de uma celula coberta por uma quantidade maxima de diamantes.

O programa pode falhar devido a varias razoes, dentre elas a insuficiencia de memoria no sistema para executaras computacoes e o overflow de um numero inteiro. Assim, nao ha garantias de que o programa ira terminar comsucesso para uma determinada entrada. O que e garantido, no entanto, e que se o programa escrever uma linhacompleta na saıda (incluindo o caractere de nova linha), entao o conteudo daquela linha sera uma reposta corretaao caso de teste correspondente. Em outras palavras, o programa tem a propriedade de que ou ele anuncia umafalha ou produz uma reposta correta.

Devido a complicacoes que fogem ao escopo deste trabalho, como a necessidade de introducao de aritmetica deprecisao arbitraria, este programa tem a limitacao de que ele so opera com coordenadas inteiras na faixa de valoresentre −231 +1 e 231−1, inclusive. Isso inclui nao so as coordenadas na entrada mas tambem as coordenadas obtidasrealizando as transformacoes descritas na secao 5. Esta faixa de valores e interessante porque ela garante que a areamaxima de subconjuntos do grid com coordenadas nesta faixa esta entre 0 e 264 − 1.

O restante desta secao ira fazer um breve estudo das partes principais do programa.

6.1 Definicoes

No arquivo defs.h podem ser encontradas as principais definicoes relativas ao programa. Entre elas ha definicoespouco pertinentes, como testes para verificar se uma expressao pode ter seu valor determinado pelo compilador emacros para a predicao de desvios e exibicao de atributos de valores e funcoes. As definicoes efetivamente pertinentesdeste arquivo sao:

• Tipos de dados basicos: bool, byte_t e size_t. Valores do tipo bool sao verdadeiro e falso. O tipo byte_te o menor tipo enderecavel pelo sistema, embora este programa precise assumir tambem que ele representavalores entre 0 e 255. O tipo size_t e capaz de representar qualquer quantidade de bytes simultaneamenteenderecaveis pelo sistema e e comumente usado para representar quantidades.

• Os tipos de dados un t e sn t, onde n ∈ 8, 16, 32, 64. Estes tipos representam inteiros sem sinal e com sinalde n bits, respectivamente. Seus valores mınimos (0 e −2n−1, respectivamente) e maximos (2n− 1 e 2n−1− 1,respectivamente) tambem estao anotados.

• O tipo coord_t, que e capaz de representar coordenadas inteiras entre COORD_MIN e COORD_MAX, que saoconstantes definidas tambem neste arquivo.

• O tipo coord_count_t, que e capaz de representar a cardinalidade de qualquer conjunto de valores do tipocoord_t.

• O tipo comp_coord_t, que e capaz de armazenar coordenadas comprimidas, e o tipo comp_coord_count_t,que e capaz de armazenar a cardinalidade de qualquer conjunto de valores do tipo comp_coord_t.

33

Page 34: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

• Os tipos radius_t e area_t, que sao respectivamente capazes de armazenar raios de diamantes e areas.

• O tipo coords_t, que e uma union armazenando duas versoes de uma coordenada: a coordenada em si(campo sparse) ou a coordenada comprimida (campo compressed).

• O tipo event_t, que e uma struct que representa um evento. Ela possui um campo do tipo coord_t chamadox que representa a abscissa do evento e dois campos do tipo coords_t chamados y0 e y1 que representam osextremos do intervalo de ordenadas do evento.

6.2 Utilitarios

Algumas partes do programa sao apenas rotinas auxiliares. Descreveremos aqui estas partes.

• O arquivo static-assert.h define a macro static_assert que permite declarar condicoes que devem severificar para o bom funcionamento do programa. Estas condicoes sao avaliadas em tempo de compilacao enao geram nenhum overhead em tempo de execucao.

• O arquivo field-to-struct.h define uma macro que permite recuperar o endereco de uma struct dados onome e o endereco de um campo dessa struct.

• Os arquivos count-decimal-digits.h e count-decimal-digits.c declaram e implementam uma funcaocount_decimal_digits, que retorna quantos dıgitos decimais seu argumento, um inteiro nao-negativo dequalquer tipo inteiro, possui.

• Os arquivos fail.h e fail.c declaram e implementam a funcao fail, que tem a mesma interface da funcaoprintf mas, em vez de imprimir uma mensagem na saıda padrao, ela descarrega a saıda padrao, imprime amensagem na saıda de erro e termina o programa com um codigo de saıda igual a 1.

• Os arquivos sat-p2-round.h e sat-p2-round.c declaram e implementam uma funcao sat_p2_round quefaz o arredodamento saturado de seu argumento para a menor potencia de dois maior ou igual a ele. Maisespecificamente, se esta potencia de dois for maior do que SIZE_MAX, a funcao retorna SIZE_MAX, senao retornaesta potencia de 2.

6.3 Ordenacao

Varios dos algoritmos discutidos neste trabalho recorrem a uma rotina de ordenacao. Nesta secao iremos mostrarcomo a ordenacao foi implementada.

O algoritmo de ordenacao adotado foi o radix-sort. Nos arquivos radix-sort.h e radix-sort.c foi declarada eimplementada uma rotina chamda radix_sort_pass com a seguinte assinatura:

void radix_sort_pass(const void**restrict B,const void*const*restrict A,size_t n,ptrdiff_t d);

Esta rotina faz o vetor de n ponteiros B se tornar uma permutacao ordenada do vetor de n ponteiros A. O criteriode ordenacao e o seguinte: um ponteiro e menor que outro se o d-esimo byte apontado por ele e menor que od-esimo byte apontado pelo outro. Mais formalmente, p e menor que q se, e somente se, ((const byte_t*)p)[d] <((const byte_t*)q)[d]. Alem disso, a ordenacao e estavel no sentido de que, se dois ponteiros ficarem empatados,o que aparecia antes em A aparecera antes em B.

Esta rotina executa em tempo O(n), mas deve-se ressaltar que a constante do termo de grau 0 e alta. Isso porque,independentemente de n, inicializa-se e computa-se as somas parciais de um vetor de 256 elementos.

Com ela em maos, pode-se implementar um algoritmo de ordenacao mais geral aplicando-a sucessivamente. Estealgoritmo esta descrito em [7]. Para fazer o vetor B se tornar uma permutacao ordenada do vetor A utilizando-o,pode-se rodar o seguinte trecho de codigo.

34

Page 35: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

while (d >= 2) radix_sort_pass(B, A, n, d-1);radix_sort_pass(A, B, n, d-2);d-= 2;

if (d != 0)

radix_sort_pass(B, A, n, 0);memcpy(A, B, n*sizeof(A[0]));

Optamos por nao implementar esta forma mais geral porque as coordenadas que iremos ordenar tem exatamentequatro bytes, entao quatro passadas sao suficientes e o codigo fica mais simples que o acima.

Por falar nisso, a estrategia de ordenacao que descrevemos ate agora e insuficiente para ordenar coordenadas. Arazao disso e que ela ordena apenas sequencias de bytes pela ordem lexicografica e a representacao de um numerointeiro nao necessariamente tem a propriedade de que inteiros menores tem uma representacao lexicograficamentemenor do que inteiros maiores.

O primeiro passo para contornar este problema e subtrair COORD_MIN de cada inteiro destes, mas encarando oproprio inteiro, o valor COORD_MIN e o resultado como um inteiro sem sinal (se um desses valores for negativo, aconversao e feita assumindo um modelo de complemento a 2). Com isso, preservamos a ordem dos inteiros e osdeixamos todos sem sinal.

O segundo passo vem da observacao de que existem dois tipos de maquinas: maquinas big-endian e maquinaslittle-endian. Em maquinas big-endian, os bytes mais significativos ficam em enderecos menores e, em maquinaslittle-endian, o contrario ocorre. Assim, se a maquina for big-endian o problema ja foi contornado (porque agora osinteiros estao sem sinal). Se a maquina for little-endian, podemos ou inverter os bytes antes de executar a operacao(para que eles fiquem em formato big-endian) ou simplesmente realizar as passadas do radix-sort em ordem inversa.Preferimos a segunda alternativa por sua eficiencia.

Ao final dessas operacoes, devemos, obviamente, voltar ao sistema anterior de representacao de coordenadas so-mando, a esses inteiros sem sinal o valor COORD_MIN (tambem interpretado como um inteiro sem sinal no modelode complemento a 2), pois esta e a operacao inversa a que realizamos.

Os arquivos coord-sort.h e coord-sort.c declaram e implementam uma funcao chamada coord_sort que fazexatamente o que foi descrito. Sua assinatura e:

void coord_sort(coord_t**restrict A, size_t n, void*restrict tmp);

Esta funcao ordena o vetor de n ponteiros A baseado no valor das coordenadas para as quais eles apontam. Ela precisade uma regiao de memoria temporaria (tmp) para operar cujo tamanho e de ao menos coord_sort_tmp_size(n)bytes (se a maquina nao puder enderecar memoria suficiente, esta ultima chamada retorna SIZE_MAX, o que deveinduzir uma eventual alocacao de memoria a falhar).

Por fim, vale ressaltar que preferimos este metodo um pouco mais complexo de ordenacao por sua eficiencia: ele rodaem O(n). Contudo, o algoritmo como um todo ainda ira rodar em O(n log n) por causa da arvore de segmentos.E tambem importante dizer que a razao de uma implementacao linear ter sido possıvel e nossa hipotese de que ascoordenadas assumem apenas valores entre −231 + 1 e 231 − 1.

6.4 Compressao de Coordenadas

Tendo uma rotina de ordenacao de coordenadas em maos, a compressao de coordenadas e uma rotina relativamentesimples. Ela esta declarada e implementada em ccomp.h e ccomp.c, se chama ccomp e possui a seguinte assinatura:

comp_coord_count_t ccomp(coord_t**restrict A,size_t n,coord_t*restrict table,void*restrict tmp);

35

Page 36: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

Esta funcao comprime as coordenadas apontadas pelos elementos do vetor de n ponteiros A da seguinte forma: elaretorna m, a quantidade de coordenadas comprimidas, e preenche a tabela table de forma que table[i] seja ovalor de ξ(i), 0 6 i < m. A tabela table deve ter espaco suficiente para guardar estes m valores. A rotina precisa deum espaco de memoria temporario (tmp) de ao menos ccomp_tmp_size(n) bytes de tamanho (este valor e saturadoem SIZE_MAX como o de coord_sort_tmp_size(n)). Finalmente, o conteudo do vetor A e perdido.

6.5 Geracao de Eventos

A funcao make_events declarada e implementada nos arquivos make-events.h e make-events.c possui a seguinteassinatura:

bool make_events(event_t*restrict i0, event_t*restrict o0,event_t*restrict i1, event_t*restrict o1,coord_t x, coord_t y, radius_t r);

Como sabemos, cada diamante sera convertido em dois retangulos e cada um deles ira gerar (em seus respectivossubproblemas) dois eventos. A rotina make_events inicializa os eventos apontados por i0, o0, i1 e o1 como oevento de entrada do primeiro retangulo, o evento de saıda do primeiro retangulo, o evento de entrada do segundoretangulo e o evento de saıda do segundo retangulo, respectivamente. Se um overflow for detectado durante aexecucao da funcao, ela retorna false, senao retorna true. Os eventos gerados sao tais que os campos das unionsy0 e y1 que valem sao os campos y0.sparse e y1.sparse. Eles representam as coordenadas nao comprimidasdestes valores.

A rotina prepare_events e declarada e implementada nos arquivos prepare-events.h e prepare-events.c epossui a seguinte assinatura:

comp_coord_count_t prepare_events(const event_t**restrict A,coord_t*restrict table,event_t*restrict E, size_t n,void*restrict tmp);

Esta rotina aponta os ponteiros do vetor de 2*n ponteiros A para os eventos no vetor de 2*n eventos E de formaque eles componham uma permutacao ordenada (pela abscissa) dos eventos. Ainda, ela assume que estes eventospossuem as coordenadas em y0 e y1 descomprimidas, as comprime (fazendo assim os campos y0.compressed ey1.compressed valerem em vez de y0.sparse e y1.sparse), inicializa a tabela table com os valores de ξ (comoccomp) e retorna o numero de coordenadas comprimidas. Ela assume tambem que table possui espaco suficiente eque tmp aponta para uma regiao de memoria temporaria de tamanho maior ou igual a prepare_events_tmp_size(n)bytes (com uma saturacao analoga a de ccomp_tmp_size(n) e coord_sort_tmp_size(n)).

6.6 Arvores de Segmentos

A caracterıstica mais marcante das arvores de segmentos implementadas aqui e que o mesmo codigo implementaambas as suas versoes: a usada no problema CCMR e a usada no problema AUR. O preco a se pagar por isso e umligeiro aumento no tempo de execucao do algoritmo (por causa de pequenas checagens em alguns pontos chave paradeterminar qual problema estamos resolvendo) e um pequeno aumento no seu consumo de memoria. As vantagenssao a simplicidade do codigo fonte e o tamanho do codigo objeto gerado. Escolhemos realizar a implementacaodesta forma pela simplicidade do codigo fonte. No entanto, cabe ressaltar que e absolutamente trivial alterar ocodigo de forma que os solucionadores dos problemas CCMR e AUR tenham copias especializadas deste codigo.

No arquivo segtree.h esta definido o tipo segtree_node_t, que e uma struct representando um no da arvore. Ocampo c representa o atributo ci de um no i. O campo x.m representa o atributo mi (caso a arvore esteja sendousada para resolver o problema CCMR) e o campo x.s representa o atributo si (caso a arvore esteja sendo usadapara resolver o problema AUR). Os campos x.m e x.s sao multiplexados em uma union para poupar espaco.

Nos arquivos segtree.h e segtree.c estao implementadas as seguintes rotinas:

36

Page 37: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

size_t segtree_size(size_t m);

void segtree_init(segtree_node_t* tree, size_t m);

void segtree_update(segtree_node_t*restrict tree, size_t m,size_t a, size_t b,s8_t delta,const coord_count_t*restrict ps);

size_t segtree_someone(const segtree_node_t* tree, size_t m);

Os valores de m passados a estas rotinas devem ser sempre potencias de dois. Os valores de tree devem ser tais quetree[1] e o primeiro no da arvore.

A rotina segtree_size(m) retorna o tamanho em bytes (saturado em SIZE_MAX) necessario para que uma arvorecom m folhas seja representada. Nas rotinas subsequentes, assumiremos que o valor de tree passado a elas e talque tree aponta para um no antes de uma area temporaria de segtree_size(m) bytes ou mais, encarada como umvetor de nos.

A rotina segtree_init inicializa a arvore tree de m folhas. Ela basicamente preenche seus campos com 0, comoja foi discutido.

A rotina segtree_update e a mais complexa. Ela insere ou remove, dependendo do valor de delta (como nosalgoritmos CCMR-Auxiliar e AUR-Auxiliar), o intervalo dos inteiros entre a e b (a pode ser maior que b, casono qual o intervalo e vazio). Se o ponteiro ps for nulo, subentende-se que estamos utilizando a arvore no problemaCCMR. Se ele nao for nulo, subentende-se que estamos utilizando a arvore no problema AUR. Neste caso, ele deveser um vetor de 2m0 posicoes representando as somas parciais descritas na secao 4.6.3, onde m0 e a quantidade decoordenadas comprimidas (2m0 − 1 6 m). E garantido que so serao lidos valores de ps[i] se alguma coordenadamaior ou igual a i-1 for coberta por algum intervalo. Isso implica que nunca sera acessado um valor ps[i] comi > 2m0.

Finalmente, a rotina segtree_someone retorna a coordenada mais a esquerda de alguem coberto por uma quanti-dade maxima de intervalos na arvore. O fato de o valor retornado ser o mais a esquerda possıvel e muito importantena implementacao de CCMR, pois ele e usado para indexar uma tabela de coordenadas comprimidas cujo tamanhopode ser menor que m (mas neste caso todo intervalo inserido pode indexar a tabela em seus extremos, e assimtambem pode o elemento mais coberto mais a esquerda).

6.7 CCMR e AUR

Os arquivos ccmr.h, ccmr.c, aur.h e aur.c declaram e implementam as seguintes rotinas:

size_t ccmr_tmp_size(size_t n);

ccmr_result_t ccmr(const event_t**restrict E, size_t n,const coord_t*restrict table, comp_coord_count_t m,void*restrict tmp);

size_t aur_tmp_size(size_t n);

area_t aur(const event_t**restrict E, size_t n,const coord_t*restrict table, comp_coord_count_t m,void*restrict tmp);

A rotina ccmr resolve o problema CCMR. Ela assume que o vetor de n ponteiros para eventos E esta ordenado porabscissas, que as coordenadas em y0 e y1 nos eventos estao comprimidas (em y0.compressed e y1.compressed),

37

Page 38: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

que o numero de coordenadas comprimidas e m, que os m valores da funcao ξ estao em table e que tmp apontapara uma regiao de memoria temporaria cujo tamanho e ao menos ccmr_tmp_size(n, m) bytes (novamente comsaturacao em SIZE_MAX). O valor retornado por esta rotina e do tipo ccmr_result_t, uma struct contendo oscampos rho, que ira conter o numero de retangulos que cobrem a celula mais coberta, x e y, que irao conter ascoordenadas de uma celula de cobertura maxima.

A rotina aur e absolutamente analoga, exceto em que ela retorna a area da uniao dos retangulos.

6.8 O Programa Principal

O codigo fonte do ponto de entrada do programa principal, a rotina main, esta no arquivo main.c. Este arquivoe poluıdo com rotinas de interface com o sistema operacional. Fora isso, ele ainda e a “cola” que junta as rotinasdescritas ate aqui. Ele, para cada caso de teste,

• Interpreta a string de comando, decidindo se ele vai executar a solucao para o problema CCMD, a solucaopara o problema AUD ou as duas.

• Le o valor de n.

• Calcula o tamanho (em bytes) do espaco de memoria necessario para resolver os problemas que ele precisaresolver nao importa qual seja a entrada nas proximas linhas.

• Aloca do sistema a memoria necessaria.

• Le os diamantes da entrada e gera os eventos.

• Resolve CCMD, se necessario.

• Resolve AUD, se necessario.

• Devolve ao sistema a memoria alocada.

• Reinterpreta a string de comando e imprime os valores desejados.

Referencias

[1] A.M. Andrew. Another efficient algorithm for convex hulls in two dimensions. Information Processing Letters,9:216–219, 1979.

[2] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction to Algorithms.McGraw-Hill Higher Education, 2001. Chapter 2.

[3] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction to Algorithms.McGraw-Hill Higher Education, 2001. Chapter 6.

[4] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction to Algorithms.McGraw-Hill Higher Education, 2001. Chapter 13.

[5] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction to Algorithms.McGraw-Hill Higher Education, 2001. Chapter 14.

[6] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction to Algorithms.McGraw-Hill Higher Education, 2001. Chapter 14, Exercise 14-1.

[7] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction to Algorithms.McGraw-Hill Higher Education, 2001. Chapter 8, Section 3.

[8] Peter M. Fenwick. A new data structure for cumulative frequency tables. 1994.

[9] S Fortune. A sweepline algorithm for voronoi diagrams. In SCG ’86: Proceedings of the second annualsymposium on Computational geometry, pages 313–322, New York, NY, USA, 1986. ACM.

38

Page 39: Algoritmos Sweep-Line e a Dist^ancia de Manhattanschultz/tcc/tcc.pdf · 2011-03-04 · Algoritmos Sweep-Line e a Dist^ancia de Manhattan Lu s Fernando Schultz Xavier da Silveira 4

[10] Ronald L. Graham. An efficient algorithm for determining the convex hull of a finite planar set. Inf. Process.Lett., 1(4):132–133, 1972.

[11] Google Inc. Increasing speed limits. http://code.google.com/codejam/contest/dashboard?c=32015#s=p2.Acessado em 5 de setembro de 2010 as 23h36 (UTC-3).

[12] Bruce Merry. Line Sweep Algorithms. http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lineSweep. Acessado em 1 de julho de 2010 as 12h51 (UTC-3).

39