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

Langage PHP Discussion :

Tester les valeurs des tableaux [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Tester les valeurs des tableaux
    Bonjour à tous
    je dispose de deux tableaux A et B contenant chacun près de 100 000 valeurs et d'un tableau C vide.
    je veux faire des tests simultanés sur les valeurs des tableaux A et B puis remplir le tableau C selon que le test réalisé soit vrai ou faux. Ce pendant, la grande taille des tableaux A et B font ramer mon code (alors que le code tourne plus vite lorsque ces tableaux sont de petites tailles) et je me demande s'il y aurait pas mieux.
    Un exemple:
    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
     
    $A=array('1','2','3','8','5');
    $B=array('6','7','8','3','10');
    $C=array();
     
    for($i=0;$i<count($b);$i++)
    {
    	if (($a[array_search($b[$i],$a)]==$b[$i]) && ($b[array_search($a[$i],$b)]==$a[$i]))
    	{
    		$c[$i]='bi';
    	}
    	else
    	{
    		$c[$i]='mono';
    	}
    }
    Explication:
    lorsque quelque part dans le tableau A on a une certaine valeur a et, à cette même position, on a une certaine valeur b dans le tableau B, si il existe une position où l'on retrouve b dans A et a dans B alors à cette position dans C on met la valeur 'bi'; autrement, on met la valeur 'mono'.
    Ce code tourne bien et à la vitesse de la lumière.
    Mais quand j'utilise de grands tableaux (100 000 valeurs), il met plus de 20 minutes!
    Comment faire pour l'optimiser avec de grands tableaux???

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for($i=0;$i<count($b);$i++)
    Là tu appelles count( ) à chaque tour de boucle. A corriger en 1er.

    Lorsque quelque part dans le tableau A on a une certaine valeur a et, à cette même position, on a une certaine valeur b dans le tableau B, si il existe une position où l'on retrouve b dans A et a dans B alors à cette position dans C on met la valeur 'bi'; autrement, on met la valeur 'mono'.
    Pas très clair mais si je comprends bien, au final, tu veux savoir si les éléments à l'index $i de $B apparaissent quelque part dans $A ?
    Si oui tu valorises $C[$i] à "bi" sinon "mono".
    C'est bon ?
    Auquel cas tu peux remplacer tes 2 array_search( ) par 1 in_array( ).

    Comment faire pour l'optimiser avec de grands tableaux???
    Travailler sur des tableaux triés pourrait être un bon début. Ainsi tu devrais pouvoir éviter d'appeler arrray_search( ) / in_array( ) à chaque tour de boucle.

    Mais quand j'utilise de grands tableaux (100 000 valeurs), il met plus de 20 minutes!
    Peux-tu transmettre un tableau valorisé et le résultat attendu ? Ainsi nous pourrions tester l'application de différents algos en PHP.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse.

    Illustration de ce que je veux faire:
    A|B|C
    ----- ---
    1|5|bi
    2|6|mono
    5|1|bi
    4|8|mono
    ..|..|...

    j'espère que c'est assez claire. De ce fait, "in_array" ne m'aide pas!
    concernant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for($i=0;$i<count($b);$i++)
    j'ai fais la correction. Merci mais pas de changements!

    Qu'entends tu par "transmettre" un tableau valorisé? mes tableaux A et près sont des tableaux contenants des entiers naturels et ayant chacun 100 000 enregistrements. peux tu utiliser cette information et l'illustration (la table) ci-dessus pour réaliser des tests?

    Merci d'avance.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Et quel est le résultat pour ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A|B|C 
    --------
    1|2|?
    2|5|?
    4|8|?
    5|1|? 
    8|4|?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Le résultat serait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A|B|C 
    --------
    1|2|mono
    2|5|mono
    4|8|bi
    5|1|mono 
    8|4|bi

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    OK, c'est plus compliqué que je ne l'avais compris.

    Bon, il est illusoire de croire que tu pourrais t'en tirer en parcourant tes tableaux (array_search( )) à chaque tour de boucle.
    Il faudrait donc les trier et les parcourir tous les 2 de manière comparative une seule et unique fois.

    Tri des tableaux sans perdre l'association clef => valeur : asort( ).
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    qu'entends tu par:
    Il faudrait donc les trier et les parcourir tous les 2 de manière comparative une seule et unique fois.
    j'ai lu la documentation de asort et je ne vois pas comment cette fonction pourrait m'aider. Pourrais tu m'en dire plus?

    Merci d'avance

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Pour reprendre le dernier exemple que j'ai posté :

    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
    A = Array
    (
        [0] => 1
        [1] => 2
        [2] => 4
        [3] => 5
        [4] => 8
    )
     
    B = Array
    (
        [0] => 2
        [1] => 5
        [2] => 8
        [3] => 1
        [4] => 4
    )
    Après asort( ) :

    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
    A = Array
    (
        [0] => 1
        [1] => 2
        [2] => 4
        [3] => 5
        [4] => 8
    )
     
    B = Array
    (
        [3] => 1
        [0] => 2
        [4] => 4
        [1] => 5
        [2] => 8
    )
    Maintenant que les tableaux sont triés on peut les parcourir en même temps, et comme asort( ) garde l'association index => valeur quand 2 éléments ont la même valeur on peut vérifier facilement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si A[ib] == B[ia]
        Bi
    Sinon
        Mono
    Je pense qu'en parcourant en même temps les 2 tableaux triés tu peux passer d'un temps d'exécutation de 20mn à quelques secondes.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    OK, je fais un test et je reviens vers toi.
    A tout à l'heure!

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Un soucis: comment entre en oeuvre le code ci après:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si A[ib] == B[ia]
        Bi
    Sinon
        Mono
    ???

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    ia est l'indice de l'élément de A que l'on traite
    ib est l'indice de l'élément de B que l'on traite

    On obtient les indices avec foreach( ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ( $a as $ia => $va ) { ...
    Ou list/each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list($ia, $va) = each($a) ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Devrais je alors faire:
    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
     
    foreach ( $a as $ia => $va ) 
    {
        foreach ( $b as $ib => $vb ) 
        {
          if ($va==$vb)
          {
              $c[$ia]='bi';
          }
          else
          {
              $c[$ia]='mono';
          }
         }
    }
    ???

  13. #13
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Le problème là est que tu ne parcours pas tes 2 tableaux en même temps.
    Tu parcours $b entièrement à chaque tour de boucle de $a, on retombe dans le même travers que précédemment.

    Parcours simultané de 2 tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ib = 0 ;
    foreach ( $a as $ia => $va ) {
        $vb = $b[$ib] ;
        ...
        $ib++ ;
    }
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  14. #14
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    IMPORTANT : pour parcourir le tableau $b trié avec asort( ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach ( $a as $ia => $va ) {
        list($ib, $vb) = each($b) ;
        ...
    }
    (autrement tu ne vas pas taper au bon endroit dans $b)
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut

    Je suis largué! j'arrive même pas à mettre cette nouvelle méthode en oeuvre avec le petit tableau d'illustration ci-dessus.
    Besoin d'aide!

  16. #16
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Essaie ç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
    17
    18
    $a = array(1, 2, 3, 8, 5) ;
    $b = array(6, 7, 8, 3, 10) ;
    $c = array_fill(0, count($a), 'mono') ;
     
    asort($a) ;
    asort($b) ;
     
    list($ib, $vb) = each($b) ;
    foreach ( $a as $ia => $va ) {
        while ( $vb != NULL && $vb < $va ) {
            list($ib, $vb) = each($b) ;
        }
        if ( $va == $vb && $a[$ib] == $b[$ia] && $ia != $ib ) {
            $c[$ia] = 'bi' ;
        }
    }
     
    print_r($c) ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bonjour.
    Merci pour le bout de code Séb.
    je suis toujours entrain de le tester. mes remarques:
    1.il faut ajouter après la ligne 14 l'instruction:2. il ne fonctionne pas avec mes grands tableaux.
    en fait mes données sont du genre:
    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
     
    A|B|C
    ------
    1|2|
    1|3|
    1|4|
    2|1|
    2|6|
    2|3|
    2|5|
    3|1|
    3|4|
    3|2|
    3|6|
    3|5|
    4|3|
    5|3|
    5|6|
    6|4|
    et le code devrait remplir la table C de façon adéquate. mais il m'affiche (lorsque je fais un echo adéquat):
    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
     
    A|B|C
    ------
    1|2|bi
    1|3|mono
    1|4|mono
    2|1|mono
    2|6|mono
    2|3|bi
    2|5|mono
    3|1|mono
    3|4|bi
    3|2|mono
    3|6|mono
    3|5|mono
    4|3|mono
    5|3|bi
    5|6|mono
    6|4|mono
    et pourtant il est sensé afficher:
    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
     
    A|B|C
    ------
    1|2|bi
    1|3|bi
    1|4|mono
    2|1|bi
    2|6|mono
    2|3|bi
    2|5|mono
    3|1|bi
    3|4|bi
    3|2|bi
    3|6|mono
    3|5|bi
    4|3|bi
    5|3|bi
    5|6|mono
    6|4|mono
    depuis lors j'essaye encore de l'adapter car ce script me paraît proche du but (vu qu'il fait près de 7secondes avec des tableaux de de 100 000 enrégistrements)
    Un coup de main?

    Merci d'avance

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Séb, à quoi sert concrètement la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ( $vb != NULL && $vb < $va ) {
            list($ib, $vb) = each($b) ;
        }
    ???

  19. #19
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut

    si le problème c'est la vitesse et pas la mémoire, est ce que ceci irait mieux ?
    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
    $a   = array('1', '1', '1', '2', '2', '2', '2', '3', '3', '3', '3', '3', '4', '5', '5', '6');
    $b   = array('2', '3', '4', '1', '6', '3', '5', '1', '4', '2', '6', '5', '3', '3', '6', '4');
    $c   = array();
    $all = array();
     
    foreach ($a as $k => $v)
    {
        $all[] = $v.$b[$k];
        $all[] = $b[$k].$v;
    }
     
    $count = array_count_values($all);
     
    foreach ($a as $k => $v)
    {
        $c[$k] = ($count[$v.$b[$k]] > 1) ? 'bi' : 'mono';
    }

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Très bien pensé. j'apprécie ta philosophie rawsrc. C'est tout simplement magnifique!

    Grand grand merci.

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

Discussions similaires

  1. Les valeurs des tableaux dans une matrice
    Par fatma hamdi dans le forum Fortran
    Réponses: 1
    Dernier message: 30/03/2008, 23h33
  2. Comment dééfinir les valeurs des abscisses en Time ?
    Par marsupilami34 dans le forum Langage
    Réponses: 1
    Dernier message: 29/09/2005, 15h50
  3. les valeurs des registres
    Par amrock dans le forum C++
    Réponses: 2
    Dernier message: 28/03/2005, 21h08
  4. [VB.NET] Choisir les valeurs des items d'un combo box?
    Par Eithelgul dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/06/2004, 10h13
  5. [servlet][tester la valeur des champs récupérés]
    Par maya5 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/05/2004, 10h06

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