(isso está relacionado à minha outra pergunta, veja aqui )
Imagine uma tela com três janelas:
Gostaria de encontrar uma estrutura de dados eficiente para representar isso, apoiando essas ações:
- retornar uma lista de coordenadas onde uma determinada janela pode ser posicionada sem se sobrepor a outras
- para o exemplo acima, se quisermos inserir uma janela de tamanho 2x2, as possíveis posições serão (8, 6), (8, 7), ..
- redimensionando uma janela na tela sem sobrepor outras, mantendo a proporção
- insira a janela na posição x, y (assumindo que não se sobrepõe)
No momento, minha abordagem ingênua é manter uma variedade de janelas e examinar todos os pontos da tela, verificando cada uma delas em alguma das janelas. Isto é Onde são a largura, altura da tela e é o número de janelas nele. Note que em geral será pequeno (digamos <10), onde cada janela está ocupando muito espaço.
algorithms
computational-geometry
user-interface
modelling
daniel.jackson
fonte
fonte
Respostas:
Uma otimização fácil para o algoritmo ingênuo é pular alguns pontos quando você verifica um coberto por uma janela. Digamos que você digitalize da esquerda para a direita, de cima para baixo. Se você encontrar um( x , y) na janela w = ( l , r , w , h ) , você pode pular de x para l + w + 1 E continue. Se as janelas são grandes e não se sobrepõem, eu desconfio muito que lhe daria umaO ( p ) algoritmo, onde p é o número de pontos no conjunto que você retorna.
De fato, pode ser benéfico verificar se as janelas são geralmente mais largas ou mais altas. Para janelas altas, seria melhor escanear de cima para baixo, da esquerda para a direita; para janelas amplas, o método discutido acima deve vencer. Você pode ter a ideia e fazer a varredura / pular na diagonal para obter um desempenho equilibrado.
De fato, ao digitalizar da esquerda para a direita, de cima para baixo, você pode se lembrar deh linhas (valores de y ) que você precisará pular ao mesmo x valor para o mesmo l + w+ 1 valor, se você atingir o x (talvez não, se houver outra janela sobreposta). Isso tornaria a digitalização de cima para baixo, da esquerda para a direita e na diagonal desnecessária para obter um desempenho equivalente.
De maneira mais geral, agora você tem duas estruturas de dados: uma comO ( 1 ) despesas gerais de pré-processamento / construção e O ( w ) pesquisas e uma com O ( p ) (possivelmente; talvez você possa fazer melhor, ou talvez minha otimização realmente não atinja isso) pré-processamento / construção e possivelmente O ( 1 ) (tabela de hash / pesquisa) ou O ( logp ) (BST). Portanto, já existem duas alternativas, ambas muito boas, realmente ...
fonte