Copertura rettangolare di Sweep Line


9

Mi è stato dato un esercizio purtroppo non ci sono riuscito da solo.

C'è una serie di rettangoli e un rettangolo . Utilizzando l'algoritmo di scansione del piano, determinare se R_ {0} è completamente coperto dall'insieme di R_ {1} .. R_ {n} .R1..RnR0R0R1..Rn

Per maggiori dettagli sul principio degli algoritmi della linea di sweep vedi qui .

Cominciamo dall'inizio. Inizialmente conosciamo l'algoritmo della linea di sweep come algoritmo per la ricerca di intersezioni di segmenti di linea che richiede due strutture dati:

  • un set Q di punti evento (memorizza i punti finali di segmenti e punti di intersezione)
  • uno stato T (struttura dinamica per l'insieme di segmenti che intersecano la linea di sweep)

L'idea generale: supponiamo che la linea di sweep l sia una linea verticale che inizia ad avvicinarsi all'insieme di rettangoli da sinistra. Ordina tutte le coordinate x dei rettangoli e memorizzale in Q in ordine crescente - dovrebbe prendere O(nlogn) . Inizia dal primo punto evento, per ogni punto determina l'insieme di rettangoli che si intersecano in corrispondenza di una determinata coordinata x , identifica segmenti continui di rettangoli di intersezione e controlla se coprono R0 completamente alla coordinata x corrente x. Con T come albero binario prenderà O(logn) . Se una parte di R0 rimane scopertaR0 non è completamente coperto.

Dettagli: l'idea dell'algoritmo di intersezione dei segmenti era che solo i segmenti adiacenti si intersecano. Sulla base di questo fatto abbiamo creato lo stato T e lo abbiamo mantenuto in tutto l'algoritmo. Ho cercato di trovare un'idea simile in questo caso e finora senza successo, l'unica cosa che posso dire è due rettangoli si intersecano se i loro corrispondenti x ed y coordinate sovrappongono.

Il problema è come costruire e mantenere T , e ciò che la complessità di costruzione e mantenere la T è. Presumo che gli alberi R possano essere molto utili in questo caso, ma come ho scoperto è molto difficile determinare il rettangolo di delimitazione minimo usando gli alberi R.

Hai idea di come risolvere questo problema, e in particolare di come costruire ?T


1
Questi rettangoli allineati agli assi o no? (Puoi farlo in entrambi i modi, ma è più facile se lo sono.)
Louis

@ Louis, semplifichiamolo un po ', supponiamo che ci siano rettangoli allineati agli assi, ma ovviamente il caso generale è più interessante
com

Quali punti di un rettangolo sono punti evento? Tutti gli angoli, quello in alto a sinistra ...?
Raffaello

@Raphael, solo x sono punti evento
com

Risposte:


6

Cominciamo con rettangoli allineati agli assi, poiché esiste una sorta di argomento diretto semplice. Spazzeremo una linea verticale. Gli eventi sono i punti finali dei bordi orizzontali dei rettangoli. Durante lo sweep manteniamo una serie di intervalli sulla linea di sweep che vengono "scoperti" da R i , i 1 :nRii1

  • Aggiungi l'intervallo verticale coperto dal rettangolo alla linea di sweep quando incontriamo per la prima volta R iRiRi
  • Rimuovi l'intervallo verticale coperto dal rettangolo dalla linea di scorrimento quando supera R iRiRi

È facile farlo con un albero binario in modo che gli aggiornamenti impieghino il tempo . (Il problema è essenzialmente unidimensionale. Capisci se gli endpoint si trovano in un intervallo scoperto e li estendi / unisci in modo appropriato quando li aggiungi e li allunghi quando li rimuovi.)O(logn)

Quindi basta controllare che, nell'intervallo di , nessuno degli intervalli scoperti intersechi mai l'intervallo verticale di R 0 . Il tutto è O ( n log n ) tempo uno spazio .R0R0O(nlogn)O(n)

Per il caso generale, l'ovvio trucco non è così veloce. Utilizzare l'algoritmo della linea di sweep standard per calcolare l'intera suddivisione planare indotta dai rettangoli.

Chiaramente alcuni set di dischi delle facce coprono R 0 . Di per sé, questo non ci dice abbastanza, dal momento che ciò che ci interessa è se una di queste facce si trova all'interno di R 0 e al di fuori degli altri rettangoli. Per fare ciò, modifichiamo un po 'la costruzione, in modo che quando aggiungiamo un bordo, etichettiamo un lato con l'identità del rettangolo all'interno. Questo aggiunge O ( 1 ) overhead, quindi la costruzione è O ( n 2 log n ) tempo; senza ipotesi sui rettangoli, l'uscita può essere Ω ( n 2 )FR0R0O(1)O(n2logn)Ω(n2) in termini di dimensioni, quindi nel peggiore dei casi utilizziamo molto spazio, quindi il tempo è "esistenzialmente ottimale" sebbene non "sensibile all'output".

Infine, è coperto fino a quando nessuna delle facce in F ha solo bordi non etichettati come in una delle R i . Il punto è che se un bordo di f è in R i , allora lo è anche l'intero f . Immagina di trascinare una linea sopra f ortogonalmente lungo questo bordo: può lasciare R i solo al di fuori di f o f è delimitato da più di un bordo di R i .R0FRifRiffRiffRi

Quindi la conclusione è che il caso speciale è e quello generale è O ( n 2 log n ) almeno, ma sospetto che possa essere migliorato.O(nlogn)O(n2logn)


La ringrazio molto per la risposta. Ci sono alcune cose che voglio chiarire sul caso generale. - i punti evento sono coordinate preordinate x , stato T - intervalli "scoperti", come ho capito, è l'intervallo corrispondente a x i di una delle R che è scoperta da qualsiasi altra R i , i 1 . La parte con R 0 non ho capito. Penso che su ogni iterazione (aggiunta) dovremmo verificare se l'intervallo si interseca con R 0 , giusto? QxTxiRRi,i1R0R0
com

RiRio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.