Dado um conjunto de intervalos em uma linha, existe um algoritmo para encontrar intervalos contidos em outros intervalos (por exemplo, Manber, "Utilizando a indução para projetar algoritmos", 1988). Existe um algoritmo para retângulos alinhados ao eixo em dimensões mais altas?
Fiz algumas pesquisas na internet e tentei pensar sobre isso sozinho, mas não consegui encontrar uma generalização para dimensões mais altas. Por exemplo, dados retângulos alinhados ao eixo no plano, a tarefa é descobrir quais retângulos estão contidos em outros retângulos.
algorithms
computational-geometry
John Donn
fonte
fonte
Respostas:
Você já considerou índices multidimensionais? Eles geralmente são bastante eficientes para encontrar retângulos sobrepostos ou incluídos.
Eu, pessoalmente, escreveu uma espécie de quadtree binário de compartilhamento de prefixo: fontes Java Tem uma API para retângulos com um método especial para pesquisar retângulos incluídos no outro retângulo:
PhTreeSolidF.queryInclude()
.Não sei ao certo qual é a complexidade, mas é aproximadamente algo na ordem de O (n * k * log n) para construir a árvore e O (k * log n) para cada consulta (k é o número de dimensões). Para conjuntos de dados fortemente agrupados, pode até perder algo para O (1) para cada consulta (eu testei isso com n = 10.000.000 e 2 <= k <= 15).
fonte
existe uma extensão / generalização natural do intervalo, buscando retângulos alinhados ao eixo e hipercubos dimensionais mais altos.
o problema se reduz à verificação da inclusão do intervalo em cada eixo separadamente e, em seguida, localizando a interseção dos retângulos ou hipercubos que "possuem" cada inclusão do intervalo 1-d. leva k * O (f (n)) onde f (n) é o momento de verificar uma única dimensão e k é o número de dimensões. isso é baseado na idéia simples de que, para retângulos / hipercubos alinhados ao eixo, um hipercubo está em outro hipercubo se todos os seus lados separados também estiverem. isso não determina apenas retângulos / hipercubos alinhados a eixos sobrepostos, embora um algoritmo semelhante possa fazer isso.
não estou ciente disso publicado na literatura, mas não é complexo e, presumivelmente, é citado em algum lugar pelo menos de passagem. a literatura sobre esse assunto geralmente trabalha com árvores Kd ou quadtrees (caso 2d) e se enquadra na categoria geral de consulta / pesquisa no intervalo de banco de dados . a abordagem geralmente seria permitir que objetos geométricos gerais fossem definidos como polígonos e, em seguida, encontre todos os nós no Kd com os quais o polígono se sobrepõe e faça o cálculo do intervalo em todos os nós do (s) polígono (s) para determinar interseções.
fonte