IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

[Matrice] Groupement "rectangulaire" maximum


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [Matrice] Groupement "rectangulaire" maximum
    Bonjour,

    Je cherche à détecter dans une matrice binaire le groupement maximum de valeur à 1 formant un rectangle si regroupé.
    J'entend par maximum, qu'il contient le plus de 1 possible.

    Exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1 0 0 1			
    1 1 1 1			1 1 1 1
    1 1 1 1			1 1 1 1
    0 1 0 0 	donne			(8 valeurs)
    
    1 0 0 1 0 1		1 1 1
    1 1 0 1 1 1		1 1 1
    1 0 1 1 1 1		1 1 1
    0 1 0 0 1 0	donne			(9 valeurs)
    Après avoir parcouru brièvement les cours algorithmique, je me rend compte à quel point le sujet est vaste. Si un algo existe déjà ou se rapproche, comment s'appellerait-il ?

    Pour le moment, sans aucune logique d'optimisation, je teste tous les ensembles possibles et garde le maximum (traitement de plusieurs heures sur de grandes matrices *aïe*). Je tente de lister des cas éliminatoire afin de ne pas vérifier tous les ensembles possibles... (ex: en n'utilisant le nombre de 1 sur une ligne et sur une colonne) mais je me demande s'il n'y a pas une autre méthode...

    Avez-vous des idées ?

    Merci !

    A+
    Cédric.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Déjà, soit je n'ai pas compris ton problème, soit dans ton 2ième exemple je compte 6 et non pas 9..

    Ensuite, j'avoue être perplexe quand je lis :

    Citation Envoyé par cbil1 Voir le message
    Je cherche à détecter dans une matrice binaire le groupement maximum de valeur à 1 formant un rectangle si regroupé.
    J'entend par maximum, qu'il contient le plus de 1 possible.
    ...
    je teste tous les ensembles possibles

    Tu cherches le plus grand rectangle ou bien les combinaisons ????

  3. #3
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    c'est vrai que la formulation n'est pas très claire ...
    Je comprends le problème comme la recherche d'un motif M sur les colonnes en maximisant le produit (nombre de 1 de M) fois (nombre de colonnes possédant ce motif), la contrainte étant que le motif est composé d'un nombre consécutif n de 1 entouré de 0. Il n'y a qu'une recherche de motif sur les colonnes et non les lignes, enfin si je comprends bien.

    Dans le premier exemple la solution est le motif (à lire en colonne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    | 0
    | 1
    | 1
    | 0
    qui est matché sur 4 colonnes -> solution de taille 8=4x2

    le motif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    | 1
    | 1
    | 1
    | 0
    est matché sur 2 colonnes -> solution de taille 6=2x3

    etc ...

    si la matrice dispose de n lignes et m colonnes, tu auras n(n-1)/2 motifs à tester
    {tu as n motifs avec un 1
    (n-1) motif avec deux 1
    ...
    n-i+1 motifs avec i 1
    ...
    1 motif avec n 1} sur chaque colonne. Donc je dirais à priori un algo de premier jet en O(mn^2).

    Pour l'implémentation en passant par des bit tricks ça pourrait améliorer les perf, mais une optimisation précoce est mère de tous les maux.

    Juste une question, la matrice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1 0 1
    0 0 0
    1 0 1
    a pour solution
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 1
    1 1 -> taille 4
    ????

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Juste une question, la matrice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1 0 1
    0 0 0
    1 0 1
    a pour solution
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 1
    1 1 -> taille 4
    ????
    ou taille 0 : moi je pense que c'est 0

    il n'y a pas de "pixels" jointifs, que des points isolés.. donc pas de rectangle.

  5. #5
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    ou taille 0 : moi je pense que c'est 0

    il n'y a pas de "pixels" jointifs, que des points isolés.. donc pas de rectangle.
    Ça dépend de ce que cbil1 a en tête ... et de sa réponse à cette question. Je suppose que ce n'est pas 0, je pense que pour lui la réponse sera 2, mais comme sa formulation est relativement vague je n'en suis pas persuadé.
    Il serait intéressant de savoir dans quel contexte est faite cette recherche, pourquoi, la taille des matrices utilisées, etc ...

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Ça dépend de ce que cbil1 a en tête ... et de sa réponse à cette question. Je suppose que ce n'est pas 0, je pense que pour lui la réponse sera 2, mais comme sa formulation est relativement vague je n'en suis pas persuadé.
    je sais pas.. Quand je lis :

    Citation Envoyé par cbil1 Voir le message
    Je cherche à détecter dans une matrice binaire le groupement maximum de valeur à 1 formant un rectangle si regroupé.
    et ses 2 exemples, je pencherais pour vraiment un "patch" contigu de 1 formant un rectangle.. Et donc 0 dans le cas que tu présentes.

  7. #7
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    je sais pas.. Quand je lis :



    et ses 2 exemples, je pencherais pour vraiment un "patch" contigu de 1 formant un rectangle.. Et donc 0 dans le cas que tu présentes.
    Son deuxième exemple montre que ce n'est pas ce qu'il cherche à faire, la solution exhibée n'est pas un "patch" contigu de 1 formant un rectangle, sinon comme tu le fais remarquer la solution aurait une taille 6, or ce n'est pas le cas car sa solution a une taille 9.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Il y a aussi un autre cas pour lequel il faudrait savoir ce que le PO souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0 0 1 1 0 0
    1 1 1 1 1 1
    1 1 1 1 1 1
    0 0 1 1 0 0
    est-ce 12 ou 4 ?

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2010
    Messages : 59
    Points : 86
    Points
    86
    Par défaut
    Dans le poste initial, il montre bien en gras les 1 qu'il garde, donc je pense que quand il parle de regroupement, c'est qu'on peux effacer autant de lignes et de colonnes désiré dans la mesure ou on a le plus grand rectangle possible...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    pour:
    1 0 1
    0 0 0
    1 0 1
     
    ça sera bien :
    1 1
    1 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    et pour :
    0 0 1 1 0 0
    1 1 1 1 1 1
    1 1 1 1 1 1
    0 0 1 1 0 0
     
    ça serait:
    1 1 1 1 1 1
    1 1 1 1 1 1
    Après au niveau de l'algo optimiser je réfléchi encore.. ^^

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour à tous !
    Merci pour toute vos réponses. Je tente d'éclaircir le point :

    Je cherche à trouver le plus grand rectangle formant des 1 si on supprime les colonnes et lignes non retenue. Pour l'exemple, je vais prendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 0 0 1 1
    1 1 0 1 0
    C'est à dire : pour chaque ligne, je prend un premier ensemble de 1, pas forcément à la suite les uns des autres. Puis avec cet ensemble, je regarde si chaque 1 est présent sur une autre ligne à la même colonne. Si c'est le cas, le maximum est augmenté.

    A partir de l'exemple ci-dessus :
    1. Initialisation du maximum : 0
    2. je teste un premier ensemble de 1 avec la première ligne (entre parenthèse la position du 1 sur la ligne), j'ai : 1(1), 1(4), 1(5). Maximum = 3.
    3. deuxième ligne avec l'ensemble précédent : j'ai bien 1(1) et 1(4) mais pas 1(5) donc KO. maximum reste à 3.
    4. je prend un autre ensemble plus petit sur la première ligne : 1(1), 1(4). Ici, ça vaut 2 donc le maximum reste a 3.
    5. sur l'ensemble du 4), je teste avec la deuxieme ligne : 1(1) et 1(4) ok. Donc, le maximum = 4.
    6. ...


    ... de manière procédural comme ça, ça m'oblige à tester tous les ensembles afin d'être sûr qu'il n'y ait pas plus grand. (enfin, tous non, car je peux zappé les ensembles avec les zeros, mais ça reste tout de même assez énorme je trouve)

    A souviron34 :
    Ce serait plutôt des combinaisons mais qui forment un rectangle au final.
    Je cherche à détecter dans une matrice binaire le groupement maximum de valeur à 1 formant un rectangle si regroupé.
    , le "si regroupé" indique ceci mais je me suis mal formulé, je l'avoue. J'aurais du écrire ainsi (?) :
    Je cherche à détecter dans une matrice binaire le groupement maximum de valeur à 1, formant un rectangle si on regroupe les 1 en ignorant les lignes/colonnes non retenues.

    A kwariz, souviron34 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1 0 1
    0 0 0
    1 0 1 -> taille 4
     
    0 0 1 1 0 0
    1 1 1 1 1 1
    1 1 1 1 1 1
    0 0 1 1 0 0 -> taille 12
    A davly :
    c'est exact. J'aurais dû mieux marqué le gras, pas assez voyant ici.

    A kwariz, (contexte)
    Je compte utiliser cet algo pour de l'optimisation CSS : choisir le meilleur regroupement declarations/selecteurs de sorte que le fichier soit le plus petit possible en quantité de caractères. Ainsi, j'aurais une matrice avec par exemple : "h1, h2, h3, a, p, div.comment, etc." en ligne et "color:blue, font-size:3px;, float:left, etc." en colonne.
    Les fichiers CSS pouvant contenir pas mal de selecteurs et declarations, on peut facilement se retrouver avec une matrice 100x100 voir plus.

    Merci encore pour vos réponses.
    A+
    Cédric

  11. #11
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par cbil1 Voir le message
    Bonjour à tous !

    A kwariz, (contexte)
    Je compte utiliser cet algo pour de l'optimisation CSS : choisir le meilleur regroupement declarations/selecteurs de sorte que le fichier soit le plus petit possible en quantité de caractères. Ainsi, j'aurais une matrice avec par exemple : "h1, h2, h3, a, p, div.comment, etc." en ligne et "color:blue, font-size:3px;, float:left, etc." en colonne.
    Les fichiers CSS pouvant contenir pas mal de selecteurs et declarations, on peut facilement se retrouver avec une matrice 100x100 voir plus.
    Dans ce cas je pense qu'il manque encore qqch, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                 color:blue
                 | font:3px
                 v v
    a           |0 1
    div.comment |1 1
    Il y a deux solutions qui dépendent de la longueur des chaînes :
    1 1 en colonne =
    a,div.comment {font:3px}
    div.comment {color:blue}
    50 caractères

    1 1 en ligne
    a {font:3px}
    div.comment {color:blue,font:3px}
    47 caractères

    L'algo devient un peu plus complexe et la sdd doit être adaptée.

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par cbil1 Voir le message
    Je compte utiliser cet algo pour de l'optimisation CSS : choisir le meilleur regroupement declarations/selecteurs de sorte que le fichier soit le plus petit possible en quantité de caractères. Ainsi, j'aurais une matrice avec par exemple : "h1, h2, h3, a, p, div.comment, etc." en ligne et "color:blue, font-size:3px;, float:left, etc." en colonne.
    A première vue, ca ne me semble pas évident de trouver la meilleure combinaison possible sans devoir tester un grand nombre e combinaisons.

    On doit pouvoir par contre trouver une solution approchée avec des algos dynamiques. Je commencerais déjà par construire la matrice de co-occurence des attributs pour trouver les meilleurs regroupements possibles.

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Bon, là ok je comprend,...

    Citation Envoyé par pseudocode Voir le message
    A première vue, ca ne me semble pas évident de trouver la meilleure combinaison possible sans devoir tester un grand nombre e combinaisons.
    Je crois qu'il y a moyen sans passer par des combinaisons. J'y réfléchis et je pond un truc dans le weekeend..

    Essentiellement du style d'une convolutoon par une 3*3..

    Par exemple éliminer les pixels isolés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    si mat(i,j) = 1
        si ( mat(i-1,j) = 0 ET mat(i+1,j) = 0) ET (mat(i,j-1) = 0 ET mat(i,j+1) = 0)
              pixel isolé
        fin si
    fin si
    Alors je suis en train de réfléchir si on peut le faire en une seule passe ou en 2. L'algo risque d'être un peu "long", c'est à dire avec quelques si imbriqués, plus quelques variables, mais je crois que je tiens le bon bout.

    A+

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    En dehors de l'intérêt mathématique du problème, je pense que le problème est mal posé et n'est pas aussi complexe :

    Citation Envoyé par cbil1 Voir le message
    A kwariz, (contexte)
    Je compte utiliser cet algo pour de l'optimisation CSS : choisir le meilleur regroupement declarations/selecteurs de sorte que le fichier soit le plus petit possible en quantité de caractères. Ainsi, j'aurais une matrice avec par exemple : "h1, h2, h3, a, p, div.comment, etc." en ligne et "color:blue, font-size:3px;, float:left, etc." en colonne.
    Les fichiers CSS pouvant contenir pas mal de selecteurs et declarations, on peut facilement se retrouver avec une matrice 100x100 voir plus.
    Tu veux donc représenter des couples (champ,valeur).

    Donc ta représentation sous forme de matrice est fausse.. :

    tous les champs ne peuvent pas avoir toutes les valeurs, et toutes les valeurs ne sont pas possibles pour tous les champs..


    Il y a 3 solutions compactes possibles à ton problème :



    Personnellement, je pense que la plus facile, vu les propriétés que tu décris, serait la 2ième, car si tu as des polices ou des couleurs il est vraisemblable que plus d'un champ les partagera..

  15. #15
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par cbil1 Voir le message
    A kwariz, (contexte)
    Je compte utiliser cet algo pour de l'optimisation CSS : choisir le meilleur regroupement declarations/selecteurs de sorte que le fichier soit le plus petit possible en quantité de caractères. Ainsi, j'aurais une matrice avec par exemple : "h1, h2, h3, a, p, div.comment, etc." en ligne et "color:blue, font-size:3px;, float:left, etc." en colonne.
    Les fichiers CSS pouvant contenir pas mal de selecteurs et declarations, on peut facilement se retrouver avec une matrice 100x100 voir plus.
    Salut,

    en cherchant un peu sur le net en essayant de regarder quelles solutions ont déjà été mises en oeuvre pour ce genre d'optimisation je suis tombé sur un de ces optimiseurs qui explique quelles optimisations il implémente mais aussi lesquelles il n'implémente pas et pourquoi. Tu peux tout trouver sur http://www.lotterypost.com/css-compress.aspx.
    Entre autre, vers la fin de la page, l'auteur déconseille les optimisations que tu essayes de mettre en oeuvre en raison du "C" de CSS :
    The "C" in CSS is extremely important: it stands for "Cascading", and means that the style rules are applied (and re-applied) in the order they appear in the page and in all the page's external CSS files. Changing the order of the styles can easily disrupt the cascade and thus change the entire layout and/or style.
    L'auteur fait remarquer que d'autres optimiseurs utilisent les optimisations que tu essayes d'implémenter mais que cela peut produire des CSS différents qui ne donnent pas le même rendu.

    Néanmoins le problème reste instéressant. Donc dans ton projet tu parses un CSS, ensuite :

    Peut-on supposer, pour la suite, que tu as implémenté les règles de simplifications syntaxiques que l'on trouve sur le site ?

    Peut-on aussi supposer que ta matrice (qui sera donc à revoir au niveau sdd) ne contient pas les cas de figure suivant
    "que des 0" = une ligne ou une colonne dont tous les éléments sont des 0
    "1 vraiment isolé" = un 1 qui se retrouve au croisement d'une ligne et d'une colonne qui autrement ne contiennent que des 0

    Désires-tu aussi implémenter l'optimisation "regroupement des style de police de caractères"? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    font-family: Arial; |
    font-size: 12px;    |- devient -> font: bold 12px Arial;
    font-weight: bold;  |

  16. #16
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,

    Citation Envoyé par kwariz Voir le message
    Il y a deux solutions qui dépendent de la longueur des chaînes :
    1 1 en colonne =
    a,div.comment {font:3px}
    div.comment {color:blue}
    50 caractères

    1 1 en ligne
    a {font:3px}
    div.comment {color:blue,font:3px}
    47 caractères
    Dans le cas d'une égalité, je donne la priorité au groupement de déclarations (ici le 2eme, 1 1 en ligne) plutôt qu'au groupement de sélecteurs.
    J'ai fait plusieurs tests papier, il s'avère qu'à chaque fois l'avantage revient au groupement de déclarations.
    La complexité ne devrait pas changer, mais cela apporte de l'importance en revanche au sens de parcours de la matrice.

    Citation Envoyé par pseudocode Voir le message
    A première vue, ca ne me semble pas évident de trouver la meilleure combinaison possible sans devoir tester un grand nombre e combinaisons.
    En effet, c'est pour ça que je partais plus sur des idées d'éliminations des combinaisons.


    Citation Envoyé par pseudocode Voir le message
    On doit pouvoir par contre trouver une solution approchée avec des algos dynamiques. Je commencerais déjà par construire la matrice de co-occurence des attributs pour trouver les meilleurs regroupements possibles.
    Merci, je vais rechercher des informations sur les algos dynamiques. Et "construire la matrice de co-occurence" me donne l'idée de travailler avec plusieurs matrices "intelligentes" plutôt qu'une seule gigantesque.


    Citation Envoyé par souviron34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    si mat(i,j) = 1
        si ( mat(i-1,j) = 0 ET mat(i+1,j) = 0) ET (mat(i,j-1) = 0 ET mat(i,j+1) = 0)
              pixel isolé
        fin si
    fin si
    Ola, je vais relire ça tête reposé et avec attention, fatigué ce soir. Merci pour la proposition.
    Kwariz, propose de supprimer les pixel isolés dès le début. (message du 17/03/2012 12h50)

    Citation Envoyé par souviron34 Voir le message
    Donc ta représentation sous forme de matrice est fausse.. :
    tous les champs ne peuvent pas avoir toutes les valeurs, et toutes les valeurs ne sont pas possibles pour tous les champs..
    L'information booléenne 1/0 dans la case indique si le champ utilise la valeur ou non.
    Cela répond-il à la remarque ? Sinon, je n'ai pas compris pourquoi la représentation sous forme de matrice est fausse.


    Citation Envoyé par souviron34 Voir le message
    Il y a 3 solutions compactes possibles à ton problème :
    ...
    Cette manière est la plus compacte, mais nécessite déjà une interprétation, et , pour garder une rétro-compatibilité, de n'ajouter des valeurs/champs qu'à la fin de la matrice (colonnes ou lignes en plus), et d'avoir un flag pour signaler l'obsolescence dans le code..
    C'est en effet un peu près le raisonnement actuel que j'ai.
    Pour le moment, je parse le fichier CSS et je construit :
    * Un tableau de sélecteurs, qui contient sa liste de déclarations
    * Un tableau de declarations, qui contient sa liste de sélecteurs
    * Pour chaque objet (Selector & Declaration), j'ai prévu des flags du style "writed, used" et une méthode size() qui me retourne la taille du selecteur ou declaration en ignorant les styles déjà utilisés. (ce qui revient à additionner les 1 non utilisé de la matrice)

    Ensuite, un traitement hyper long qui vérifie les combinaisons... (plusieurs heures sur le CSS de la fnac ^^) et c'est là que j'ai voulu passé par une idée "matrice" car je me suis rendu compte qu'en prenant le plus grand rectangle de "1" -sans compter les lignes/colonnes non utilisées- j'avais ma combinaison la plus optimale. Je n'ai pas présenté ce que j'avais déjà fait, car je pensais avoir suffisamment bien isolé mon problème pour le rendre indépendant du contexte.

    Pour la matrice, je comptais la créer à partir de référence du type tab[int][int]{boolean} (false:0, true:1) ou tab[int][int]{int} (int: 0/1 ou somme de 1 sur la ligne, si utile).
    Bien sûr, une fois la meilleur combinaison trouvée, je recréé ou recalcule la matrice pour trouver la suivante.

    A noter, que je construit la matrice à partir du fichier parsé : je n'inventerai pas de couple propriété/valeur non utilisé d'une declaration.
    Si on a p{ background-color: blue;} et a{color: red}, je n'aurais pas dans la matrice, les déclarations "background-color: red" et "color: blue".


    Citation Envoyé par kwariz Voir le message
    en cherchant un peu sur le net en essayant de regarder quelles solutions ont déjà été mises en oeuvre pour ce genre d'optimisation je suis tombé sur un de ces optimiseurs qui explique quelles optimisations il implémente mais aussi lesquelles il n'implémente pas et pourquoi. Tu peux tout trouver sur http://www.lotterypost.com/css-compress.aspx.
    Entre autre, vers la fin de la page, l'auteur déconseille les optimisations que tu essayes de mettre en oeuvre en raison du "C" de CSS
    Oui, j'ai bien pris en compte la raison de C "Cascading" : j'ai conscience que cet optimisation peut "casser" la page sans retravailler un peu le CSS à la main, mais je pense que cette action manuelle est plus simple que d'optimiser tout le CSS à la main. Car les optimiseurs actuels que j'ai trouvé ne s'occupe pas vraiment de l'"erreur humaine" (genre, si tu n'as pas pensé à regrouper les sélecteurs), cette étape étant assez prise de tête voir difficile lorsque tu as pondu 1000 lignes de CSS.
    Les éléments suivants nous sont en plus favorable à la limite de la "casse" graphique :
    - A égalité d'optimisation, je fais/ferais (selon l'algo final) en sorte de prendre les premiers éléments du fichier
    - On connaît déjà l'ordre "qui marche" (fichier parsé), rien n'empêchera de faire un outil qui liste les déplacements d'ordre pour faciliter la correction dans un second temps.

    Citation Envoyé par kwariz Voir le message
    Peut-on supposer, pour la suite, que tu as implémenté les règles de simplifications syntaxiques que l'on trouve sur le site ?
    Oui. Si je le fait pas personnellement, c'est que j'utiliserai un outil déjà prévu pour.

    Citation Envoyé par kwariz Voir le message
    Peut-on aussi supposer que ta matrice (qui sera donc à revoir au niveau sdd) ne contient pas les cas de figure suivant
    "que des 0" = une ligne ou une colonne dont tous les éléments sont des 0
    Il n'y aura jamais "que des 0" sur une ligne ou colonne, car je me base sur un fichier parsé : si une declaration ou sélecteur est dans la matrice, c'est qu'elle est utilisé.
    Dans le cas d'un second passage, je prévois de recréer la matrice.

    Citation Envoyé par kwariz Voir le message
    "1 vraiment isolé" = un 1 qui se retrouve au croisement d'une ligne et d'une colonne qui autrement ne contiennent que des 0
    J'avoue que je n'avais pas pensé à ce cas éliminatoire dès le début. Je peux faire en sorte qu'il n'y ait pas de "1 vraiment isolé" dans la matrice.

    Citation Envoyé par kwariz Voir le message
    Désires-tu aussi implémenter l'optimisation "regroupement des style de police de caractères"? :
    Pour le moment, j'ai l'intention d'utiliser des déclarations déjà optimisés, avant la création de la matrice. Et donc "font: bold 12px Arial;".
    Je vérifierai plus tard si il peut réellement avoir un cas où il est préférable de l'avoir en séparé afin de générer des groupements.


    Pour information, j'ai également pensé à ceci sur la matrice, afin de faciliter le parcours et la recherche du fameux rectangle imaginaire
    • Pour chaque ligne compter le nombre de 1, garder le maximum
    • Pour chaque colonne compter le nombre de 1, garder le maximum
    • pour chaque case à 1, vérifiez le nombre de 1 sur la colonne (nb1Col)

      • en déduire le nombre de 1 nécessaire au minimum sur la ligne pour dépasser le maximum (min1required) si tous les nb1Col "1" sont utilisés. (de mémoire min1required = floor(nb1Col/2) )
      • Si une ligne < min1required : élimination
      • Continuer avec nb1Col-1


    C'est un peu lourd, mais cela faisait partie de mes idées "éliminatoire" entre autre.

    Je vous remercie sincèrement pour l'intérêt que vous portez à mon sujet d'algorithme.

    Bonne soirée à tous !
    A+
    Cédric.

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Avant de réfléchir plus à ton post, un truc saute aux yeux :

    tu dis :

    Citation Envoyé par cbil1 Voir le message
    Ola, je vais relire ça tête reposé et avec attention, fatigué ce soir. Merci pour la proposition.
    Kwariz, propose de supprimer les pixel isolés dès le début. (message du 17/03/2012 12h50)
    Mais après :

    Citation Envoyé par cbil1 Voir le message
    J'avoue que je n'avais pas pensé à ce cas éliminatoire dès le début. Je peux faire en sorte qu'il n'y ait pas de "1 vraiment isolé" dans la matrice.
    qui, ou alors je n'ai rien compris, est exactement ce que je proposais - et sans doute kwarz avant moi..

  18. #18
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour Souviron34,

    Citation Envoyé par souviron34 Voir le message
    qui, ou alors je n'ai rien compris, est exactement ce que je proposais - et sans doute kwarz avant moi..
    Autant pour moi, désolé. Je n'avais pas tres bien compris la logique des séries "mat(i,j)" hier soir, mais comme j'ai vu "pixel isolé", j'ai fait le lien avec le message de kwariz (j'ai rajouté "Kwariz, propose de supprimer..." après).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    si mat(i,j) = 1
        si ( mat(i-1,j) = 0 ET mat(i+1,j) = 0) ET (mat(i,j-1) = 0 ET mat(i,j+1) = 0)
              pixel isolé
        fin si
    fin si
    Je comprend donc (ce matin) que ce petit algo me permet de détecter les pixels isolés. Sauf qu'ici, l'algo montre que le pixel est isolé sur un pas de une case seulement, non ? Il faut donc que je fasse la même chose avec une boucle de parcours de la ligne/colonne. (Pas de soucis la dessus)


    Merci, A+
    Cédric.

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cbil1 Voir le message
    L'information booléenne 1/0 dans la case indique si le champ utilise la valeur ou non.
    Cela répond-il à la remarque ? Sinon, je n'ai pas compris pourquoi la représentation sous forme de matrice est fausse.
    Pourquoi ? c'est simple..

    Tu compliques le traitement - et la modélisation, et donc la solution - inutilement..

    • Quand on a une image, on n'a pas le choix, on a un rectangle, une matrice.
    • Quand on fait du calcul matriciel, certaines choses sont complexes (comme dans ton problème de prendre en compte le nombre de lignes/colonnes).
    • Quand on stocke des informations sur quelque chose pour lequel cette information n'a aucun sens, on perd du temps, de la place, et on augmente la complexité inutilement
    • Quand on modélise quelque chose de variable (nombre de valeurs par rapport au nombre de champs) en quelque chose de fixe (matrice) on se complique la vie et on ne voit pas le vrai problème : on rend dépendant des choses qui sont indépendantes.
    • Quand on a quelque chose d'adapté , on trouve une solution simple et élégante, et qui plus est souvent rapide


    En conséquence, et vu le sujet que tu veux aborder, je pense et maintiens que la solution la plus adaptée est une solution dynamique. Théoriquement la solution est celle que j'ai mentionné en 2, mais si tu veux hyper-compact alors c'est la 3, mais présentée différemment de manière algorithmique / structurelle...

    Non seulement c'est compact, souple, mais la solution algorithmique est beaucoup plus simple..

    Au lieu d'avoir une matrice, je te propose un tableau de tableaux, ou, si tu préfères, une liste de tableaux ou un tableau de structures

    Element de la liste / structure = indice A, nb, tableau d'indices B

    • L'indice A correspond (au choix) à ce que dans ta matrice tu mettais en ligne/colonne.
    • Le tableau d'indices B correspond à l'autre, mais ne contient que ce pour lequel A fait du sens


    Tu élimines le problème des 0 et des 1 contigus ou non, et donc l'ensemble du problème de ce fil, puisque tu restes cohérent.. L'usage de la mémoire est optimisé (pas de champs inutiles), et le temps de calcul l'est aussi, de même que la taille du fichier produit..

    Le fichier se présenterait donc comme :

    0:2,4;val/3:1,5;val/....
    et l'écriture ou la lecture serait directe...

    Si tu te fabrqiues des tableaux internes de correspondance (ce qui est déjà le cas, d'après ce que j'ai compris), du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableau champ [h1, h2, h3, a, p, div.comment, etc]
     
    tableau valeur (  color, font-size;, left, etc ]
    tu auras ET la structure la plus compacte ET le fichier le plus compact..

    Dans le cas de ton exemple, cela ne change pas ton fichier par rapport à stocker une matrice, puisque tu as une correspondance 1-1 entre paramètres et valeurs, mais de manière générale, "color" ou "left" peut être partagé par plusieurs champs... et donc, plus il y a de champs pouvant avoir les mêmes valeurs, plus on compresse....

    On pourrait donc avoir un fichier comme :

    0:0,6,7;blue/1:1,7;12/...
    Et même (si le code suit, en transformant la structure pour contenir un tableau de structures et non pas juste un tableau d'indices) plusieurs valeurs pour des champs différents pour la même propriété :

    0:0,6,7;blue/0:8,9;red/1:1,7;12/...
    Là, tu manipules des choses indépendantes en te limitant à ce qui fait du sens pour chaque élément, et donc tu enlèves purement et simplement ton problème algorithmique

    De plus, si besoin est, il est facile d'éviter la remarque du "C Cascading" en remplaçant les indices dans le fichier par leurs libellés.. Le plus compact tout en étant en clair. Et ça pourrait se faire en code juste via un flag général ("explicite"" ou "non").

  20. #20
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Re-,

    quelques idées en passant :

    1. En gardant ta matrice 0/1
    Tu as les selecteurs(S) et les descriptions (D) à partir desquels tu construis ta matrice. Un 1 à la croisée d'un S et d'un D signifie que S utilise D.
    Tu disposes aussi d'une fonction nettoyage qui élimine simplement toute ligne ou colonne composée uniquement de 0 et qui élimine aussi les 1 strictement isolés en émettant le code CSS associé. Dans la suite je suppose que les S sont en ligne et les D en colonne.
    Il peut être intéressant de trier S et D par ordre décroissant, cela va impliquer qu'utiliser des 1 le plus en haut à gauche sera "plus efficace" dans le sens "ça factorisera les plus longues chaines". Il serait peut être bien de commencer les recherches de ce côté là.
    Il manque un petit truc, tous les 1 ont le même poids dans tes rectangles. Il faudrait pondérer autrement, quelquechose comme si le 1 en position i,j est utilisé dans un rectangle alors son poids P(i,j) vaut 0 auquel on ajoute (S(i) si le rectangle fait plus d'une ligne, 0 sinon) et (D(i) si le rectangle ait plus d'une colonne, 0 sinon). Le poids du rectangle est la somme des poids le formant. Il sera proportionnel "aux caractères économisés".
    Une fois le code pour un rectangle émis on mets tous ses 1 à 0, on nettoie et on recommence.
    Une recherche exhaustive sera évidemment très couteuse, mais on peut imaginer plusieurs heuristiques :
    A. on élimine dans un premier temps le maximum de petites optimisation (en bas à droite) jusqu'à obtenir une matrice de taille raisonnable avec "les longues chaines" que l'on peut chercher exhaustivement.
    B. on fait l'inverse, on cherche à factoriser au maximum en "haut à gauche", ...

    2. En faisant une incursion dans la théorie des graphes
    Tu définis en fait un graphe biparti, l'ensemble des noeuds étant D union S. Tu recherches à partitionner ce graphe en un ensemble de bicliques. Tu peux calculer le coût de cet ensemble et tu cherches à minimiser ce cout.
    Une représentation possible peut être ce que j'expose en 1. D'autres pistes pourraient se trouver ... que représente dans ce cas le problème de trouver l'ensemble de stables minimum partitionnant le graphe complémentaire ?

    3. En faisant une incursion dans la théorie des langages
    Tu cherches à réecrire du code CSS. Y a-t-il quelquechose à faire en considérant l'AST que tu construis en parsant le code et en y appliquant des règles de réécritures/simplifications ?

    Je vais essayer de me prendre un peu de temps pour réfléchir à tout ça.

    Petites réflexions :

    En fait tu cherches à construire un compresseur de CSS.
    On trouve facilement des compresseurs CSS "sans perte". Quelquepart tu cherches à en construire un "avec perte", car les factorisations que tu essayes de faire peuvent amener de "petites modifications" aux résultat final. Dans cette veine on pourrait imaginer pousser le concept un poil plus loin : imagine un fichier CSS dans lequel tu trouves beaucoup de
    font: 12px; et de font:11px;
    On pourrait imaginer tester le "remplacement de l'un par l'autre" (ne garder que font:11px par exemple) pour augmenter le taux de compression mais en ayant "plus de perte" (un peu à la JPEG).

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo