Fiz um exercício, infelizmente, não consegui sozinho.
Há um conjunto de retângulos e um retângulo . Usando o algoritmo de varredura de avião, determine se é completamente coberto pelo conjunto de .
Para mais detalhes sobre o princípio dos algoritmos de linha de varredura, consulte aqui .
Vamos começar do começo. Inicialmente, conhecemos o algoritmo de linha de varredura como o algoritmo para encontrar interseções de segmentos de linha, o que requer duas estruturas de dados:
- um definido de pontos de evento (armazena pontos finais de segmentos e pontos de interseção)
- um status (estrutura dinâmica para o conjunto de segmentos que a linha de varredura cruza)
A idéia geral: suponha que a linha de varredura é uma linha vertical que começa a se aproximar do conjunto de retângulos da esquerda. Classifique todas as coordenadas dos retângulos e armazene-as em em ordem crescente - deve usar . Comece do primeiro ponto do evento, para cada ponto determine o conjunto de retângulos que se cruzam na coordenada x especificada , identifique segmentos contínuos dos retângulos de interseção e verifique se eles cobrem completamente na coordenada x atual . Com como uma árvore binária, será necessário . Se alguma parte de permanecer descoberta, essa não é completamente coberto.
Detalhes: a ideia do algoritmo de interseção de segmentos era que apenas segmentos adjacentes se cruzam. Com base nesse fato, criamos o status e o mantemos durante todo o algoritmo. Tentei encontrar uma idéia semelhante nesse caso e, até agora, sem sucesso, a única coisa que posso dizer é que dois retângulos se cruzam se as coordenadas correspondentes e sobrepõem.
O problema é como construir e manter , e que a complexidade de construir e manter é. Suponho que as árvores R possam ser muito úteis nesse caso, mas como eu achei muito difícil determinar o retângulo delimitador mínimo usando árvores R.
Você tem alguma idéia de como resolver esse problema e, particularmente, de como construir o ?