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 :

le plus court prefixe


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut le plus court prefixe
    salut a tous:

    je veux creer un algo qui calcule le plus court prefixe dans un mot c'est a dire si j'ai le mot ( abababab ) son plus court prefixe est ( ab ).

    moi j'ai reussi a parcourir la chaine (le mot) par 2 pointeur mais le probleme c'est comment les stoker.

    Voila mon algo:
    Code C : 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
    18
    int i,j=0;
    char v[N],w[N],*p,*q;
    gets(v);  
    p=v;
    q=v+1;
    for(i=0;i<strlen(v);i++)
    {
        if (*p==*q)
        {
            w[j]=*p;
            p++;
            q++;
            j++;
        } 
        else
            q++; 
    }
    printf("w=%s\n",w);

  2. #2
    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 : 52
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    le plus court prefixe dans un mot c'est a dire si j'ai le mot ( abababab ) son plus court prefixe est ( ab )
    ?

    Par exemple, c'est quoi le "plus court prefixe" dans (abcdbcabbdca) ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut
    voila la definition:
    le plus court prefixe d'un mot w est : u tels que w=(u puissance k)

  4. #4
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    ?

    Par exemple, c'est quoi le "plus court prefixe" dans (abcdbcabbdca) ?
    dons ton exemple il reste le meme abcdbcabbdca
    .

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 122
    Par défaut
    Un préfixe c'est pas censé être genre : para, anti ??

    Et juste pour voir si j'ai compris l'explication dans "coucou" le préfixe serait "cou" car "coucou" = "cou"². C'est ça ?

    Et par curiosité, ça serait possible de connaitre le but de récupérer le préfixe d'un mot ??

  6. #6
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut
    Citation Envoyé par Shr3ck Voir le message
    Un préfixe c'est pas censé être genre : para, anti ??

    Et juste pour voir si j'ai compris l'explication dans "coucou" le préfixe serait "cou" car "coucou" = "cou"². C'est ça ?

    Et par curiosité, ça serait possible de connaitre le but de récupérer le préfixe d'un mot ??
    oui, c'est ça le sous mot qui se repete "cou"

  7. #7
    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 : 52
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par roccocham Voir le message
    voila la definition:
    le plus court prefixe d'un mot w est : u tels que w=(u puissance k)
    w = u puissance k = uuu...uuuu (k fois)

    Si on fait un petit décalage circulaire, lettre par lettre, de (w) jusqu'a retrouver le mot de départ, alors on trouvera la valeur de u

    (w) = abcabcabcabc

    (w)<<1 = bcabcabcabca
    (w)<<2 = cabcabcabcab
    (w)<<3 = abcabcabcabc = (w)

    donc (u) = 3 premieres lettres de (w) = (abc)
    et k = longueur(w)/longueur(u) = 12/3 = 4

    c'est à dire (w) = (abc) puissance 4
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    w = u puissance k = uuu...uuuu (k fois)

    Si on fait un petit décalage circulaire, lettre par lettre, de (w) jusqu'a retrouver le mot de départ, alors on trouvera la valeur de u

    (w) = abcabcabcabc

    (w)<<1 = bcabcabcabca
    (w)<<2 = cabcabcabcab
    (w)<<3 = abcabcabcabc = (w)

    donc (u) = 3 premieres lettres de (w) = (abc)
    et k = longueur(w)/longueur(u) = 12/3 = 4

    c'est à dire (w) = (abc) puissance 4
    good alor u = abc

  9. #9
    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 : 52
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Le plus proche du C que je peux faire en Java, c'est un truc comme ca:

    Code java : 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
    18
    19
    char[] w = "abcabcabcabc".toCharArray();
    int wlen = w.length;
     
    // pour chaque décalage possible
    for(int shift=1;shift<=wlen;shift++) {
     
    	// regarde si (w) = (w)<<shift 
    	int i;
    	for(i=0;i<wlen;i++)
    		if (w[i]!=w[(i+shift)%wlen]) break;
     
    	// si c'est le cas, affiche 'u' et sort de la boucle
    	if (i==wlen) {
    		String u = new String(w,0,shift);
    		int k = wlen/shift;
    		System.out.printf("w = (%s)^%d", u, k);
    		break;
    	}
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Le plus proche du C que je peux faire en Java, c'est un truc comme ca:

    Code java : 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
    18
    19
    char[] w = "abcabcabcabc".toCharArray();
    int wlen = w.length;
     
    // pour chaque décalage possible
    for(int shift=1;shift<=wlen;shift++) {
     
    	// regarde si (w) = (w)<<shift 
    	int i;
    	for(i=0;i<wlen;i++)
    		if (w[i]!=w[(i+shift)%wlen]) break;
     
    	// si c'est le cas, affiche 'u' et sort de la boucle
    	if (i==wlen) {
    		String u = new String(w,0,shift);
    		int k = wlen/shift;
    		System.out.printf("w = (%s)^%d", u, k);
    		break;
    	}
    }

    mreci pseudocode mais je suis encore debuttant en c votre fonction est difficile pour moi voila mon nouveau algo si il ya une erreur merci de la corriger.

    Code C : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include<stdio.h>
    #define N 50
     
    main()
    { 
        int i,j=0,M=0;
     
        char v[N],w[N],*p,*q;
        for(i=0;i<N;i++)
        w[i]=NULL;
     
       gets(v);  
     
       p=v;
       q=v+1;
       for(i=0;i<strlen(v);i++)
       {if (*p==*q)
      { w[j]=*p;
       p++;
      q++;
      printf("w[%d]=%c\n",j,w[j]);
      j++;
     } 
      else
      q++; 
    }
     printf("j=%d\n",j);
     M=strlen(v)-j;
      printf("M=%d\n",M);
     if(w[M-1]!=NULL)
     for(i=0;i<M;i++)
      printf("\n\nw[%d]=%c\n",i,w[i]);
      else
        printf("\n\nnooott okkk ");
     getch();
          }
     
    }

  11. #11
    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 : 52
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par roccocham Voir le message
    voila mon nouveau algo si il ya une erreur merci de la corriger.
    Je dirais que ca marche (*) si le mot de départ est effectivement une puissance (avec k>=2).

    (*) mise a part un dépassement de buffer pour la variable 'q' dans la boucle for(). Je mettrais un while à la place :

    for(i=0;i<strlen(v);i++) --> while (q<strlen(v))
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  12. #12
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Je dirais que ca marche (*) si le mot de départ est effectivement une puissance (avec k>=2).

    (*) mise a part un dépassement de buffer pour la variable 'q' dans la boucle for(). Je mettrais un while à la place :

    for(i=0;i<strlen(v);i++) --> while (q<strlen(v))
    merciiiii pseudocode

  13. #13
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Curieux, en lisant rapidement les codes il me semble que personne n'utilise le fait que la longueur d'un préfixe doit être un diviseur de la longueur de la chaîne.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  14. #14
    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 : 52
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Curieux, en lisant rapidement les codes il me semble que personne n'utilise le fait que la longueur d'un préfixe doit être un diviseur de la longueur de la chaîne.
    Pas bête ça.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    en python je ferai ça (je connais pas C désolé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mot = 'coucou'
    l = len(mot)
    c=1
    while mot.count(mot[:c])*c != l:c+=1
    print mot[:c]

  16. #16
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Compte tenu de la remarque faite plus haut, et vu qu'il n'y a pas d'appel à 'count',ceci risque d'être plus efficace:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    mot = 'coucou'
    l = len(mot)
    for c in (i for i in xrange(1,l+1) if l%i==0):
        if mot==mot[:c]*(l/c) :
            print mot[:c]
            break
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  17. #17
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    bien vu Zavonen ...
    j'ajouterai donc ce code avec un if et un iter en moins:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mot = 'coucou'
    l = len(mot)
    for c in range(1,l+1):
            if mot[:c]*(l/c)==mot:break
    print mot[:c]
    ou
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mot = 'coucou'
    l,c = len(mot),1
    while mot[:c]*(l/c)!=mot:c+=1
    print mot[:c]

  18. #18
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    @josmiley
    Tu fais toujours le test pour tous les nombres entre 1 et l pas seulement pour les diviseurs de l et ton test coûte cher (plus cher qu'une division euclidienne si la chaîne est longue).
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  19. #19
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    @josmiley
    Tu fais toujours le test pour tous les nombres entre 1 et l pas seulement pour les diviseurs de l et ton test coûte cher (plus cher qu'une division euclidienne si la chaîne est longue).
    oui, c'est vrai, si la chaine est longue ta méthode est bien meilleur.
    c'est à adapter selon les besoins.

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Par défaut
    Bonjour


    J'ai la même chose à faire mais dans le langage algorithmique.
    Comme je ni connais rien en C pourrait tu stp décrire un peu ton algo les fonctions et à quoi correspondent les variables.



    Merci

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. [algo] plus courts chemins (au pluriel !!)
    Par ADSL[fx] dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/01/2006, 14h40
  3. néophyte, faire une requête plus courte
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 10/10/2005, 09h44
  4. algorithme de Ford (recherche chemin le plus court)
    Par abstraite dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 19/05/2005, 10h39
  5. Réponses: 2
    Dernier message: 21/03/2004, 18h57

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