Algo Tableau, occurence unique

Algo Tableau, occurence unique - Algo - Programmation

Marsh Posté le 10-02-2003 à 16:05:44    

Bon j'irais dormir après promis :o,
 
mais avant :whistle:  
j'ai un tableau de chiffre
comment renvoyer un tableau avec une occurence de chaque chiffre maxi
 
ex:1;2;3;2;3;1  après fction on obtient 1;2;3
 
j'ai honte  :sweat:


Message édité par AGA le 10-02-2003 à 16:06:14
Reply

Marsh Posté le 10-02-2003 à 16:05:44   

Reply

Marsh Posté le 10-02-2003 à 18:57:34    

ça s'appelle un ensemble. tu construis un autre tableau à partir du premier: si l'élément n'est pas dans le nouvo tableau, ben tu l'ajoutes. et ainsi de suite

Reply

Marsh Posté le 10-02-2003 à 19:17:09    

Tu prends chaque element du tableau en In et tu parcours le nouveau pour voir si tu peux le mettre?
 
Bon ok ;)
 

Reply

Marsh Posté le 10-02-2003 à 19:55:25    

1;2;3;2;3;1  
 
une fois trié :
 
1;1;2;2;3;3
 
suffit maintenant d'enlever les doublons.

Reply

Marsh Posté le 17-02-2003 à 21:09:35    

youdontcare a écrit :

1;2;3;2;3;1  
 
une fois trié :
 
1;1;2;2;3;3
 
suffit maintenant d'enlever les doublons.


 
 [:plusun] , avec un tri rapide (qsort.h) auparavant, cet algo est carrément plus efficace que celui de ++Taz ! (faut l'imaginer dans le pire des cas = tableau très grand)
Avec le tri on fait un parcours de N éléments dans le tableau trié. Sans le tri, on parcours N+(N-1)+(N-2)+...+1 fois le tableau qu'on rempli.


Message édité par Giz le 17-02-2003 à 21:13:35
Reply

Marsh Posté le 17-02-2003 à 21:23:54    

évidemment, mais bon, commence pas à la jouer, parce que aga ne trouvais pas l'algo pour faire ça, une solution simple fonction tres bien. d'ailelurs j'ai jamais parlé de l'organisation du tableau (ou autre SD): j'ai dit, "tu construit un autre: si y ait pas, t'ajoutes, sinon tu passes au suivant". je n'ai pas parlé de relation d'ordre comme tu le sous-entend avec ton tri. si on ne dispose ni de hashcode, ni de relation d'ordre, je ne vois pas rien d'autres qu'une strucutre linénaire.
 
hashcode => table de hash
 
relation d'ordre => tas, arbres, un tableau trié avec des opérations dichotomiques, ou une structure linéaire non-ordonée sont autant d'implémentations valides.
 
il faut considérer le pire des cas, certes, mais pas forcément. si l'ensemble est de petite taille, une structure linéaire tout simple fera tres bien le boulot, et peut etre plus rapidement. c'est bon exemple pour implémenter une Factory pour spécialiser les traitements (organisation différente en fonction de la quantité de données à manipuler et de leur type)
 
tout dépends des besoins

Reply

Marsh Posté le 17-03-2003 à 01:35:47    

"tout dépends des besoins"
exactement !
 
et vu qu'on a à faire à des chiffres:
 
char T1[N],T2[10],T3[10],k=0;
int i;
memset(T2,0,10);
for (i=0;i<N;i++) T2[T1[i]]|=1;
for (i=0;i<10;i++) if (T2[i]) T3[k++]=i;
 
T3 contient les k chiffres présents
 
rq: ca marche aussi pour des 0<=T1[i]<=255 , en remplacant 10 par 255

Reply

Marsh Posté le 17-03-2003 à 07:11:27    

Deaddy a écrit :

"tout dépends des besoins"
exactement !
 
et vu qu'on a à faire à des chiffres:
 
char T1[N],T2[10],T3[10],k=0;
int i;
memset(T2,0,10);
for (i=0;i<N;i++) T2[T1[i]]|=1;
for (i=0;i<10;i++) if (T2[i]) T3[k++]=i;
 
T3 contient les k chiffres présents
 
rq: ca marche aussi pour des 0<=T1[i]<=255 , en remplacant 10 par 255
 

c'est l'anti-exemple d'une implémentation claire. bestof des codes foireux  [:xp1700]

Reply

Marsh Posté le 17-03-2003 à 07:32:10    


sur excel j'avais fais un truc pour supprimer les doublons tu peux l'adapter
 
Sub doublons()
Dim temp()
Sheets("Brouillon" ).Activate
Range([a1], [a1].End(xlDown)).Select
cc = Selection.Rows.Count - 1
ReDim temp(cc)
 
For i = 0 To cc
temp(i) = Range("A1" ).Offset(i)
Next
 
' le tableau temp contient les donnees
 
k = 0
 
 
 
While k < cc
 
For i = k + 1 To cc
 If temp(i) = temp(k) Then
   temp(i) = "X"
 End If
Next
k = k + 1
While (temp(k) = "X" ) And (k < cc)
k = k + 1
Wend
 
Wend
 
j = 0
'les valeurs sont celles qui ne contiennent pas "X"
 
For i = 0 To cc
If temp(i) <> "X" Then
Range("a1" ).Offset(j) = temp(i)
j = j + 1
End If
Next
 
 
 
End Sub

Reply

Marsh Posté le 17-03-2003 à 15:19:59    

lol ++taz !  
t'étais ptet pas encore bien réveillé à ct'heure la
(enfin j'espère que c'était de l'humour)

Reply

Marsh Posté le 17-03-2003 à 15:19:59   

Reply

Marsh Posté le 17-03-2003 à 16:24:42    

Deaddy a écrit :

lol ++taz !  
t'étais ptet pas encore bien réveillé à ct'heure la
(enfin j'espère que c'était de l'humour)

ct de l'humour mais je deconseille fortement ta solution. c'est unv rai casse-tete pour la comprednre et encore plus pour la modifier. n'oublies pas "Computer cycles are cheap, but human cycles are very expensive". je maintiens donc, mais pas méchemment

Reply

Marsh Posté le 17-03-2003 à 18:06:53    

ouai, je comprends ta politique même si je déplore son aspect plus commercial qu'algorithmique.

Reply

Marsh Posté le 17-03-2003 à 18:14:29    

Deaddy a écrit :

ouai, je comprends ta politique même si je déplore son aspect plus commercial qu'algorithmique.

[:xp1700]  
 
beaucoup d'entre nous sommes etudaints en informatique, certains en vivent déjà: faire du code lisible et réutilisable, c'est notre priorité. Ca n'a rien de comemrcial, c'est un gage de qualité.
 
Ne me dis pas que l'algorithme ressort de ton implémentation

Reply

Marsh Posté le 17-03-2003 à 20:01:41    

Franchement le coup des doublons sur des chiffres( 1 a 9 ?) en
temps lineaire c'est facile
pas besoin d'implantations compliquees ni de qsort (qui en plus est plutot n*n dans le pire des cas..):
 
++Taz c'est toi qui a tort meme si le code gagnerait surement
en clarté avec des noms explicites.
 
Par exemple reecrit en C++:
 

Code :
  1. void doublons(const vector<char>& src, vector<char> &dst) {
  2.     bool compteur[] = {false, false, false, false, false, false, false, false, false, false};
  3.     vector<char>::const_iterator it;
  4.     for (it= src.begin(); it != src.end(); ++it)
  5.     {
  6.         compteur[*it] = true;
  7.     }
  8.     dst.resize(0); // si dst n'est pas vide
  9.     for (int i = 0; i<10; ++i)
  10.     {
  11.         if (compteur[i])
  12.            dst.push_back(i);
  13.     }
  14. }


 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 17-03-2003 à 21:30:08    

pouh c compliqué tous vos trucs. amusez vous bien dans vos histoires et quand vous aurez un vrai traitement, rappele moi  :hello:

Reply

Marsh Posté le 18-03-2003 à 00:37:41    

lol trop drôle cette pitite dispute à 2 balles.
 
bref. c'est toi là ++Taz ? http://dejean.benoit.free.fr/Photos/IMG_0759.jpg
 
a+

Reply

Marsh Posté le 18-03-2003 à 07:10:00    

oui    [:spamafote]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed