Algo

espe -  
 espe -
Bonjour,

Je voudrais savoir comment (algo)calculer le nombre de cellules entre les deux premières occurrences d'une val?

Et également l'algo de l'insertion d'un element avant la deuxième occurrence?

merci.
Configuration: Windows Vista
Firefox 3.0.11

6 réponses

  1. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    c'est quoi exactement une occurence ?
    0
  2. KX Messages postés 19031 Statut Modérateur 3 020
     
    Une occurrence c'est le nombre d'apparition, ici il s'agit en fait de calculer le nombre de cellules qu'il y a entre la première fois où une valeur apparait, et la deuxième fois où celle-ci apparait.

    Une question cependant : avec quel langage ?
    0
  3. espe
     
    je vous remercie de m'avoir répondu. Il ne s'agit pas d'un langage en particulier. Il s'agit des structures de données. C'est à dire de l'algorithme pure et simple avec des listes chainées.. Par ailleurs je fais du java en apprentissage.
    0
  4. Giorgiolino Messages postés 250 Date d'inscription   Statut Contributeur Dernière intervention   52
     
    Bonjour,

    voici une proposition d'algorithme pour toi, essaye d'en comprendre le fonctionnement.

    val = mavaleur // valeur dont on cherche le nombre d'occurrences)
    nb_Cell = 0  // nombre de cellules entre la 1ère et la 2ème occurrence
    
    i = 0 	//indice de parcours de la liste qui donne aussi la position
    j = 1 	//j est l'indice de l'occurence de "mavaleur"
    
    Tant que (pas fin de la liste et j<3)
    	{
    
    	Si (valeur[i] = val)
    		{
    
    		 position[j] = i
    		 j = j+1
    		/* 
    		Si on trouve une occurence, on passe à la suivante, 
    		sinon on ne fait rien.
    		*/
    
    		}
    
    	i = i+1   
    	/* 
    	On parcourt toujours le tableau, que l'on ait trouvé 
    	une occurence ou pas (tant qu'on n'est pas à la 3ème bien sûr)
    	*/
    
    	}
    
    nb_Cell = position[2] - position[1] - 1


    Pourquoi "-1" ?
    Parce qu' entre la 2 et la 4 par exemple il n'y a pas "4 - 2" (soit 2) cellules
    mais plutôt "4 - 2 -1" (soit 1) cellule.

    Ce même algorithme te permettra même de trouver le nombre de cellules
    entre les occurrences de ton choix (si elles existent), par exemple la
    2ème et la 4ème.
    Il te suffira alors de changer j<3 par j<5.

    Bon courage.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KX Messages postés 19031 Statut Modérateur 3 020
     
    Il y a un gros problème avec ton code Giorgiolino, c'est que tu traites un tableau alors que espe semble plutôt chercher du code avec des listes chainées...

    Je propose ce code (en Pascal) qui doit pas être trop mal :

    Je fais une fonction qui calcule le nombre de maillons parcouru avant de trouver `val` dans la liste, et qui transmet en paramètre le pointeur de cette position.

    Avec la même fonction mais en partant du deuxième pointeur, j'en déduis le deuxième "indice" qui me permet de faire le calcul de distance.

    Remarque : je propage un "-1" d'erreur si je ne trouve pas deux éléments de valeur `val`
    type PListe=^ListeChainee; // pointeurs sur un type ListeChainee
    
         ListeChainee=record
                      v:integer; // on considère des valeurs entières
                      suiv:PListe; // pointeur vers le maillon suivant
                      end;
    
    function PremiereOccurrence(p:PListe; var q:PListe; val:integer):integer; // q est le pointeur dont on donne l'indice en résultat
    var n:integer;
    begin
    if p=nil then begin
                  q:=nil;
                  result:= -1 // on a plus aucun élément dans la liste
                  end
             else begin
                  if p^.v=val then begin
                                   q:=p;
                                   result:=0; // élément 0 : 1er élément
                                   end
                              else begin
                                   n:=PremiereOccurrence(p^.suiv,q,val);
                                   if n= -1 then result:=-1
                                            else result:=n+1;
                                   end;
                  end;
    end;
    
    function Distance(var p:PListe; val:integer):integer;
    var q,r:PListe; n1,n2:integer;
    begin
    n1:=PremiereOccurrence(p,q,val); // n1 : la première occurence
    n2:=PremiereOccurrence(q,r,val); // n2 : la deuxième occurence
    if (n2= -1) then result:= -1 // il n'y a pas 2 éléments `val` dans la liste
                else result:=n2-n1-1; // -1 : voir l'explication de Giorgiolino
    end;
    0
    1. blux Messages postés 19193 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Salut,

      oui, mais en fait la demande porte sur de l'algo, pas sur un langage spécifique.

      Donc, la réponse de Giorgiolino est tout à fait valable, pour peu que l'on suppose qu'une liste chainée peut être un tableau (dont le parcours séquentiel donne le même résultat que le parcours d'une liste).
      0
  7. espe
     
    Merci KX.
    Merci à tout le monde de prendre le temps et d'avoir la gentillesse me répondre.
    0