es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    1. Crear una lista vacía llamada resultList para almacenar los rectángulos más pequeños.
    2. Ordenar la lista de entrada de rectángulos en orden decreciente según el área.
    3. Para cada rectángulo rect en la lista de entrada:
      1. Comprobar si rect ya está cubierto por algún rectángulo en resultList, si es así, continuar con el siguiente rectángulo.
      2. De lo contrario, agregar rect a resultList.
      3. Para cada rectángulo compRect en resultList:
        1. Comprobar si compRect puede dividirse en rectángulos que cubran completamente rect.
        2. Si es así, dividir compRect y reemplazarlo con los rectángulos de cubrimiento en resultList.
    4. Devolver 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 en resultList. Si lo está, el algoritmo continúa con el siguiente rectángulo. De lo contrario, se agrega rect a resultList.

    Para cada rectángulo compRect en resultList, el algoritmo verifica si compRect puede dividirse en rectángulos que cubran completamente rect. Si es posible, compRect se divide y se reemplaza con los rectángulos de cubrimiento en resultList.

    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.

Comments are closed.