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

Scilab Discussion :

Temps de calcul boucles for imbriquées


Sujet :

Scilab

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Temps de calcul boucles for imbriquées
    Bonjour à toutes et à tous,

    je suis en train de faire un cours sur le codage, et pour cela, je cherche à créer l'ensemble des string à 4 lettres minuscules de a à z, sous scilab 5.4.1 32 bits.

    Voici mon code:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    clear
    clc
    alphabet=('abcdefghijklmnopqrstuvwxyz');
     
     
    tic()
    for i=1:26
        v(i)=part(alphabet,i);
    end
    toc()
     
    k=1;
    tic()
    for a=1:26
        for b=1:26
            for c=1:26
                for d=1:26
                    w(k)=v(a)+v(b)+v(c)+v(d);
                    k=k+1;
                end
            end
        end
    end
    toc()
    Mon problème est le suivant: le temps de calcul est beaucoup trop long, du coup j'ai fait varier a de 1 à 1 (environ 3s ), puis de 1 à 3 (environ 28 s) puis de 1 à 6 (environ 120s).

    Plus a varie plus le temps de calcul est long, mais le temps de calcul est exponentiel, alors qu'en toute logique il devrait être proportionnel.

    D'où mes questions:
    y a t il une erreur dans mon code, ou en tout cas une façon de programmer que scilab n'aime pas?
    y aurait-il une façon plus simple de générer l'ensemble de ces mots (aaaa,aaab,aaac...)?
    Mais pourquoi donc le temps de calcul n'est pas proportionnel, qu'il y ait de petites différences, en fonction de la charge CPU etc, je veux bien, mais la je ne comprends pas?

    Merci, Maxime.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Les boucle sont à éviter dans ce genre de problème car la variable w change de taille à chaque itération, ce qui nuit généralement aux performances du code.
    Je maîtrise mieux ce sujet avec MATLAB, mais je pense que Scilab réagit de la même façon.

    Voici une version plus efficace qui se base sur l'analyse des permutations dans le tableau final :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    clear
    clc
     
    alphabet = 'abcdefghijklmnopqrstuvwxyz';
     
    N = length(alphabet);
     
    tic();
    for i = 1:N
        v(1,i) = part(alphabet, i);
    end
    t = toc();
     
    disp(t)
     
    tic();
     
    d = repmat(v, 1, N*N*N);
     
    c = repmat(v, N, 1);
    c = repmat(c, 1, N*N);
     
    b = repmat(v, N*N, 1);
    b = repmat(b, 1, N);
     
    a = repmat(v, N*N*N, 1);
     
    w = a(:) + b(:) + c(:) + d(:);
     
    t = toc();
     
    disp(t)
    A tester…

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    ca marche!!!

    merci beaucoup pour cette réponse, ca marche impeccable.
    Effectivement, pour les boucles for, je devrais définir au préalable la taille de ma matrice w, cela devrait mieux marcher.

    Mais ta méthode m'a beaucoup plu.

    Du coup ci-joint le code optimisé pour marcher quelle que soit la taille de l'alphabet.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    clear
    clc
     
    //alphabet = 'abcdefghijklmnopqrstuvwxyz';
    alphabet = 'abcdef';
    N = length(alphabet);
     
    tic();
    for i = 1:N
        v(1,i) = part(alphabet, i);
    end
    t = toc();
    disp(t)
     
     
     
     
    tic();
    for i=1:N
        u(:,:,i)=repmat(v,N^(i-1),N^(N-i));
    end
     
    w=[];
    for j=1:N
        w=w+u(:,:,N-j+1);
    end
    w=w';
     
    t = toc();
    disp(t)
    Bon certes au dela de 6 lettres dans l'alphabet, un problème de pile (stacksize) apparait, mais ça, c'est un autre problème...

    Et aussi merci pour les Cours et tutoriels pour apprendre Scilab

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

Discussions similaires

  1. Boucles for imbriquées
    Par The eye dans le forum ASP
    Réponses: 2
    Dernier message: 19/07/2007, 13h00
  2. Boucle for imbriqué
    Par boula dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/07/2007, 13h42
  3. 2 boucles for imbriquées
    Par karimphp dans le forum Langage
    Réponses: 8
    Dernier message: 02/12/2006, 15h46
  4. Batch - Deux boucle For imbriquées plus un FC
    Par Lorponos dans le forum Windows
    Réponses: 17
    Dernier message: 27/07/2006, 15h58
  5. [Syntaxe] Boucle For imbriquées en 1.5
    Par Piolet dans le forum Langage
    Réponses: 5
    Dernier message: 09/01/2005, 01h49

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