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 :

Estimer une position d'insertion


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut Estimer une position d'insertion
    Bonjour,

    Tout d'abord, désolé pour ce titre peu explicite, j'espère qu'il le deviendra après l'exposé du problème.

    Dans le cadre de la création d'un document DOM (XML, tout ça) je voudrais calculer (ou estimer) l'endroit où doit être inséré un nouvel élément dans une liste d'éléments existants en fonction de la DTD associée au parent.

    Exemple :
    Un élément test déclare la DTD suivante :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <!ELEMENT test (sub, (title, sub, text)*)

    Etant donné que je suis en création, il est possible de n'avoir qu'une partie des éléments, comme par exemple :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <test>
      <title/>
      <sub/>
    </test>
    <!--  ou bien  -->
    <test>
      <sub/>
      <text/>
    </test>
    <!--  ou encore  -->
    <test>
      <sub/>
      <title/>
    </test>

    Si je veux rajouter l'élément sub dans chacun de ces trois cas, je n'ai normalement qu'une seule solution "optimale" : celle qui me donne la DTD la plus valide possible :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <test>
      <sub/><!-- nouvellement inséré -->
      <title/>
      <sub/>
    </test>
    <!--  ou bien  -->
    <test>
      <sub/>
      <sub/><!-- nouvellement inséré -->
      <text/>
    </test>
    <!--  ou encore  -->
    <test>
      <sub/>
      <title/>
      <sub/><!-- nouvellement inséré -->
    </test>

    Ou, pour décrire ça de façon moins verbeuse et surtout plus proche de mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [title, sub] -> [sub, title, sub]
    [sub, text]  -> [title, sub, sub]
    [sub, title] -> [title, sub, sub]
    Le truc bien entendu c'est que je n'arrive à rien.

    J'avais testé plusieurs algos dont le dernier en date ressemblait à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    fonction rechercheIndexPossible(filsActuels:Liste, nouveauFils:Element) : Entier {
      dernierFils:Element;
      pour (i := filsActuels.length ; i >= 0; i--) {
        si (nouveauFils estInsérable entre filsActuels[i] et dernierFils) {
          // on ajoute après l'élément actuel
          return i + 1;
        }
      }
      // le nouveau fils n'est insérable après aucun élément actuel, on teste s'il l'est avant le premier :
      si (nouveauFils estInsérable avant dernierFils) {
        return 0;
      }
    
      // impossible de l'insérer
      return -1;
    }
    Le problème c'est qu'en déroulant l'algo sur les exemple que j'ai donné, on voit tout de suite que ça ne fait pas ce que je veux.

    Du coup je n'ai plus aucune idée de comment estimer l'index d'insertion pour que ça donne au moins un état qui soit compatible avec la DTD (si on considère qu'on ajoute suffisament d'éléments pour ça).

    Je suppose qu'il faut passer par du backtracking pour ça mais mes cours d'IA remontent à loin et je serai actuellement incapable de faire un tel algo en partant de zéro.

    Du coup si vous avez des pistes à me proposer ou un début d'algo, je suis preneur !

    Merci d'avance,
    Loceka.

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    (sub, (title, sub, text)*) est représenté par
    Code (sub, (title, sub, text)*) est représenté par : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                Groupe
                  type: séquence
                  obligatoire
              /               \
             /                 \
            /                   \
    Elem                      Groupe
      nom: sub                  type: séquence
      obligatoire               multiple ou nul
                              /        |       \
                             /         |        \
                            /          |         \
                    Elem           Elem           Elem
                      nom: title     nom: sub       nom: text
                      obligatoire    obligatoire    obligatoire

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Bon, je crois que j'ai trouvé une solution.

    Elle se fait en deux étapes distinctes :
    1. Rechercher l'ensemble des indexes possibles d'insertion dans la liste des fils actuels.
    2. estimer (à l'aide d'une heuristique) la position la plus pertinente pour l'insertion.


    Du coup, il ne me reste plus qu'à trouver une heuristique potable, mais pour ça je doute que vous puissiez m'aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] insertion d'une chaine de caractéres dans une position bien definie
    Par afifaNancy dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/06/2012, 08h40
  2. INSERT à une position donnée
    Par b_zakaria dans le forum Langage SQL
    Réponses: 16
    Dernier message: 01/08/2008, 10h55
  3. Réponses: 17
    Dernier message: 29/08/2005, 13h53
  4. Un spacer pour une position absolue
    Par Notilius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/04/2005, 20h09
  5. Réponses: 2
    Dernier message: 26/05/2004, 17h53

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