Algoritmo para encontrar el número más pequeño de rectángulos a partir de una forma de rectángulos superpuestos en un espacio cíclico.
Tengo un espacio cíclico de 2 dimensiones compuesto por cuadros unitarios y una lista de rectángulos formados por estos cuadros en ese espacio. El tamaño del espacio es de la forma (2^n; 2^n) y los rectángulos son secciones de ese espacio.
Estoy buscando un algoritmo para determinar una lista con el menor número de rectángulos que cubran la misma área que la lista anterior.
Los rectángulos en la primera lista pueden superponerse.
Lo mismo es posible para la lista de resultados.
Estaba pensando en dar al rectángulo un punto de inicio y una longitud para cada dirección:
Esta sería ((2;1); 3; 1) en un espacio de tamaño (4; 4) por ejemplo:
Por el momento, lo único que veo es comprobar cada rectángulo con los demás con el fin de reducirlos hasta su eliminación completa, luego fusionarlos para hacer que el rectángulo desaparezca, pero ni siquiera estoy seguro de que funcione.
Debido al gran tamaño del espacio y al hecho de que en el peor de los casos, el rectángulo más grande tendrá un tamaño de la mitad del espacio, utilizar una matriz o tabla no es una opción viable, ya que mi objetivo es encontrar un algoritmo en tiempo polinomial como máximo, y tal vez una solución general para n dimensiones.
davy.ai
Algoritmo para la lista más pequeña de rectángulos
Para determinar una lista con la menor cantidad de rectángulos que cubren la misma área que la lista anterior, podemos utilizar el siguiente algoritmo:
resultList
para almacenar los rectángulos más pequeños.rect
en la lista de entrada:rect
ya está cubierto por algún rectángulo enresultList
, si es así, continuar con el siguiente rectángulo.rect
aresultList
.compRect
enresultList
:compRect
puede dividirse en rectángulos que cubran completamenterect
.compRect
y reemplazarlo con los rectángulos de cubrimiento enresultList
.resultList
.Explicación:
El algoritmo comienza creando una lista vacía llamada
resultList
para almacenar los rectángulos más pequeños que cubren la misma área que los rectángulos de entrada. La lista de entrada de rectángulos se ordena en orden decreciente según el área, de modo que los rectángulos más grandes se manejan primero.Para cada rectángulo
rect
en la lista de entrada, el algoritmo verifica si ya está cubierto por algún rectángulo enresultList
. Si lo está, el algoritmo continúa con el siguiente rectángulo. De lo contrario, se agregarect
aresultList
.Para cada rectángulo
compRect
enresultList
, el algoritmo verifica sicompRect
puede dividirse en rectángulos que cubran completamenterect
. Si es posible,compRect
se divide y se reemplaza con los rectángulos de cubrimiento enresultList
.Al final del algoritmo,
resultList
contiene los rectángulos más pequeños que cubren la misma área que los rectángulos de entrada.Este algoritmo se ejecuta en tiempo polinómico, ya que recorre cada rectángulo en la lista de entrada y cada rectángulo en
resultList
. También es generalizable a n dimensiones, ya que solo requiere comprobar si un rectángulo se puede dividir en rectángulos que cubran otro rectángulo.