Puzzle: Trouver plus grand rectangle (maximale rectangle de problème)
Ce qui est le plus efficace algorithme pour trouver le rectangle avec la plus grande superficie qui s'inscrivent dans l'espace vide?
Disons que l'écran ressemble à ceci ('#' représente la zone remplie):
....................
..............######
##..................
.................###
.................###
#####...............
#####...............
#####...............
Une solution probable est:
....................
..............######
##...++++++++++++...
.....++++++++++++###
.....++++++++++++###
#####++++++++++++...
#####++++++++++++...
#####++++++++++++...
Normalement, je voudrais profiter de trouver une solution. Cette fois, bien que j'aimerais éviter de perdre du temps à tâtonner sur moi-même depuis que cela a une utilité pratique pour un projet que je suis en train de travailler sur. Est-il une solution bien connue?
Shog9 a écrit:
Est votre entrée un tableau (comme le laissent supposer les autres réponses), ou une liste des occlusions dans la forme d'arbitraire, de taille moyenne, placé rectangles (comme ce pourrait être le cas dans un système de fenêtrage lorsque vous traitez avec des positions de la fenêtre)?
Oui, j'ai une structure qui assure le suivi d'un ensemble de fenêtres placées sur l'écran. J'ai aussi une grille qui conserve la trace de toutes les régions entre chaque bord, qu'ils soient vides ou pleins, et la position d'un pixel de leur bord gauche ou supérieur. Je pense qu'il ya une forme modifiée qui profitent de cette propriété. Connaissez-vous un?
Vous devez vous connecter pour publier un commentaire.
Je suis l'auteur de ce Dr Dobb's article et d'obtenir parfois posé des questions sur la mise en œuvre. Voici un exemple simple d'un dans C:
Il prend son entrée, à partir de la console. Vous pourriez par exemple tuyau de ce fichier:
Et après l'impression de son entrée, il sera de sortie:
La mise en œuvre ci-dessus est rien de compliqué, bien sûr, mais c'est très proche de l'explication du Dr Dobb's de l'article et doit être facile à traduire tout ce qui est nécessaire.
@lassevk
J'ai trouvé l'article en référence, à partir de DDJ: Les Maximales Rectangle Problème
Voici une page qui a un peu de code et l'analyse.
De votre problème commence un peu vers le bas sur la page, la recherche de la page pour le texte maximale rectangle problème.
http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module6/module6.html
@lassevk
HAHA... O(m2, n2).. C'est probablement ce que j'aurais fait.
Je vois qu'ils vont développer optmizations... regarde bien, je vais le lire.
J'ai mis en place la solution de Dobbs en Java.
Aucune garantie de quoi que ce soit.
Après avoir lutté tellement j'ai écrit cet algorithme...Viens de voir le code...
Vous comprendre.Ce code parle !!
Je suis l'auteur de la Maximale Rectangle Solution sur LeetCode, qui est ce que cette réponse est fondée sur.
Depuis la pile, la solution a déjà été discuté dans les autres réponses, je voudrais présenter une optimale
O(NM)
de la programmation dynamique solution qui provient de l'utilisateur morrischen2008.Intuition
Imaginer un algorithme dans lequel, pour chaque point, nous avons calculé un rectangle en procédant de la manière suivante:
Trouver le maximum de la hauteur du rectangle par l'itération vers le haut jusqu'à ce qu'une zone remplie est atteint
Trouver le maximum de la largeur du rectangle par l'itération vers l'extérieur à gauche et à droite jusqu'à une hauteur qui ne veut pas accueillir la hauteur maximale du rectangle
Par exemple trouver le rectangle défini par le point jaune:
Nous savons que l'maximale du rectangle doit être l'un des rectangles construits de cette manière (le max rectangle doit avoir un point sur sa base, où le prochain carré plein est hauteur au-dessus de ce point).
Pour chaque point, on définit des variables:
h
- la hauteur du rectangle défini par ce pointl
- la bande gauche du rectangle défini par ce pointr
- la bande droite du rectangle défini par ce pointCes trois variables définissent de façon unique le rectangle en ce point. Nous pouvons calculer l'aire de ce rectangle avec
h * (r - l)
. Le maximum global de tous ces domaines est de notre résultat.Utilisant la programmation dynamique, nous pouvons utiliser la
h
,l
, etr
de chaque point de la ligne précédente pour calculer lah
,l
, etr
pour chaque point dans la ligne suivante dans le temps linéaire.Algorithme
Ligne donnée
matrix[i]
, nous gardons la trace de lah
,l
, etr
de chaque point de la ligne par la définition des trois tableaux -height
,left
, etright
.height[j]
correspondra à la hauteur dematrix[i][j]
, et ainsi de suite et ainsi de suite avec les autres tableaux.La question devient maintenant comment mettre à jour chaque tableau.
h
est défini comme le nombre de continue espaces vacants dans un ligne à partir de notre point. On incrémente le compteur si il y a un nouvel espace, et de mettre zéro si l'espace est rempli (nous sommes à l'aide de " 1 " pour indiquer un espace vide et '0' comme un rempli un).Considérons quelles sont les causes des changements à la gauche de la lie de notre rectangle. Depuis toutes les instances des espaces remplis survenant dans la ligne au-dessus de l'actuel ont déjà été pris en compte dans la version actuelle de
left
, la seule chose qui affecte notreleft
est si on rencontre un espace rempli dans notre ligne actuelle.Ainsi, nous pouvons définir:
cur_left
est plus grand que la plus à droite, rempli de l'espace, nous l'avons rencontré. Lorsque nous "élargir" le rectangle de gauche, nous savons qu'il est impossible d'étendre delà de ce point, sinon ça va fonctionner dans l'espace rempli.Ici, nous pouvons réutiliser notre raisonnement dans
left
et de définir:cur_right
est le plus à gauche survenance d'un espace rempli, nous l'avons rencontré.Mise en œuvre