Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2426 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Suivante
Auteur Sujet :

[Concours] Recherche de doublons dans une séquence

n°719876
el muchach​o
Comfortably Numb
Posté le 09-05-2004 à 16:46:13  profilanswer
 

Reprise du message précédent :
assyrium, mets ton code entre les balises "[ c p p ]" et "[/ c p p ]" (enlève les espaces que j'ai rajoutés pour éviter qu'elles ne soient inerprétées).
 
Ensuite, quelques commentaires ne seraient pas de trop, surtout que ton algo est costaud, et que tout le monde ne sait pas ce qu'est un arbre AVL (ce qui est mon cas... :sweat: ).
 
Enfin, petite remarque :

Code :
  1. bool operator > (Position &p)
  2.   {
  3.    if (n > p.n) return true;
  4.    return false;
  5.   }


 
Peut être écrit  

Code :
  1. inline  bool operator > (Position &p){ return (n > p.n); }


 
En tout cas, chapeau bas, parce que ton algo tient la corde, et de loin, et même en l'optimisant, je ne pense pas que ma solution puisse atteindre cette performance.


Message édité par el muchacho le 09-05-2004 à 17:02:00
mood
Publicité
Posté le 09-05-2004 à 16:46:13  profilanswer
 

n°719894
Taz
bisounours-codeur
Posté le 09-05-2004 à 16:59:20  profilanswer
 

et marquer tout ça const ça bouffe pas de pain
 
 
sinon merci d'avoir réinventer la roue, merci d'avoir fait du bien mauvais C++

n°719902
jagstang
Pa Capona ಠ_ಠ
Posté le 09-05-2004 à 17:02:17  profilanswer
 

Taz a écrit :

et marquer tout ça const ça bouffe pas de pain
 
 
sinon merci d'avoir réinventer la roue, merci d'avoir fait du bien mauvais C++


Tu nous en fais une version de C++ dont tu as le secret ?

n°719909
el muchach​o
Comfortably Numb
Posté le 09-05-2004 à 17:11:05  profilanswer
 

Taz a écrit :

et marquer tout ça const ça bouffe pas de pain
 
 
sinon merci d'avoir réinventer la roue, merci d'avoir fait du bien mauvais C++


 
Sois plus indulgent et reconnais que le travail d'assyrium, même si le style est très "C", est intéressant. Quelle partie de son code considères-tu comme une "réinvention de la roue ?"
Comment écris-tu des algos sur des arbres sans faire un lourd usage des pointeurs ?

n°719925
Taz
bisounours-codeur
Posté le 09-05-2004 à 17:55:14  profilanswer
 

en utilisant STl : pas la peine de se cogner un arbre à la main :i

n°719932
assyrium
Posté le 09-05-2004 à 18:17:37  profilanswer
 

oki oki, je vais commenter tout ça. Pour le mauvais c++... je l'ai dit que je l'ai fait vite... et si j'ai refait les arbres , c'est pour y implémenter des optimisations qui n'auraient pas pu l'être avec d'autres templates. Par ailleurs, je suis plus un fervant utilisateur du C, et c'est vrai que cela peut s'en ressentir. Mais à la base, le C++ est une mauvaise implémentation de l'objet. Le java est un vrai langage objet (n'en déplaise à taz). C'est aussi un avantage du C++ qui permet d'intégrer des notions de C. Car quoi qu'on en dise, les compilateurs C++ ne font pas toujours ce que l'on désire.
 
Pour taz :
La critique est facile, l'art est difficile.

n°719941
Taz
bisounours-codeur
Posté le 09-05-2004 à 18:47:53  profilanswer
 

mais biensur ... bon là je m'y tiens, je dégage de ce topic de qualité

n°719982
assyrium
Posté le 09-05-2004 à 20:17:42  profilanswer
 

Par ailleurs, un site qui explique très bien les arbres avl : http://brassens.upmf-grenoble.fr/I [...] resAVL.htm
 
en attendant les commentaires (je n'ai pas le temps ce soir)

n°720229
el muchach​o
Comfortably Numb
Posté le 10-05-2004 à 09:14:48  profilanswer
 

Taz a écrit :

en utilisant STl : pas la peine de se cogner un arbre à la main :i


 
Je viens de voir un "stl/tree.h" ecrit chez HP avec google.
 
Mais dans la doc SGI, il n'en est pas fait mention, comme si cette implementation n'avait pas ete retenue. Et comme jusqu'a present, je me base la-dessus...
http://www.sgi.com/tech/stl/table_of_contents.html
 
Je ne vois pas d'arbre la-dedans, meme si j'ai cru comprendre que std::set est implemente a l'aide d'un arbre. Si on peut s'en servir a la place d'un arbre, c'est dommage qu'il n'en soit nullement fait  mention, parce que ca ne tombe pas sous le sens a priori.
 
Pour un arbre AVL, il y a au moins un type qui s'est cogne toute l'implementation a la main :
http://www.geocities.com/wkaras/gen_cpp/avl_tree.html
 
ou les auteurs de LEDA par exemple.

n°720231
el muchach​o
Comfortably Numb
Posté le 10-05-2004 à 09:21:08  profilanswer
 

assyrium a écrit :

Par ailleurs, un site qui explique très bien les arbres avl : http://brassens.upmf-grenoble.fr/I [...] resAVL.htm
 
en attendant les commentaires (je n'ai pas le temps ce soir)


 
Commence par ajouter les balises [c p p] et [/ c p p], ca prend 10 secondes...
Le principal reproche que je ferais a ton code (a part le truc anecdotique avec tmp = tampon[i+j]) est, si j'ai bin compris, qu'il utilise un long long pour stocker les sous-chaines, ce qui est une solution de facilite qui le rend trop specifique et inutilisable en pratique : si je decide que le tableau est compose de caracteres, ca ne marche plus, ou si mon tableau, au lieu d'etre aleatoire, comporte une chaine de 25 caracteres repetes, il ne marche plus non plus.


Message édité par el muchacho le 10-05-2004 à 09:34:07
mood
Publicité
Posté le 10-05-2004 à 09:21:08  profilanswer
 

n°720351
el muchach​o
Comfortably Numb
Posté le 10-05-2004 à 11:07:28  profilanswer
 

Taz a écrit :

mais biensur ... bon là je m'y tiens, je dégage de ce topic de qualité


 
 :sarcastic: Au lieu de te laisser abattre, tu devrais plutôt donner des pistes pour améliorer les choses dans ce cas-ci.
J'ai proposé ce petit problème en pensant que ça intéresserait les gars comme toi, et je suis content qu'assyrium ait donné sa solution, aussi imparfaite soit-elle, parce que j'apprends des choses. L'intérêt de ce topic est qu'il montre qu'un même problème peut avoir des solutions très diverses. On en a au moins 5, dont deux viables. Si elles sont bien codées, c'est encore mieux, mais je pense que le topic soulève  tout de même des questions intéressantes.


Message édité par el muchacho le 10-05-2004 à 11:07:54
n°720382
assyrium
Posté le 10-05-2004 à 11:18:44  profilanswer
 

Code :
  1. #include <iostream.h>
  2. #include <cstdlib>
  3. unsigned int N = 5000000;
  4. const unsigned long SEED = 17L;
  5. class Position **PositionsRedondantesG;
  6. int NbPositionsG;
  7. template <class T> class noeud
  8. {
  9. private:
  10.   noeud *fg;
  11.   noeud *fd;
  12.   int dq;//desequilibre du noeud
  13.   int Nb;//compteur du nombre d'occurence de l'element ajoute
  14.   T Info;
  15.  
  16. public:
  17.   T &RInfo(){return Info;}
  18.   noeud<T> *Ajouter(T &Info, noeud *&Lien, int &G);
  19.   //noeud<T> *Ajouter(noeud<T> &Info, noeud *&Lien, int &G);
  20.   void RotationDroite(noeud *&N);
  21.   void RotationGauche(noeud *&N);
  22.   void RotationGaucheDroite(noeud *&N);
  23.   void RotationDroiteGauche(noeud *&N);
  24.   void Reequilibrer(noeud *&Lien, int des);
  25.   void Vider();
  26.   noeud(T &Info)
  27.   {
  28.    fg = NULL;
  29.    fd = NULL;
  30.    noeud::Info = Info;
  31.    Info.SetParent(this);
  32.    Nb = 1;
  33.    dq = 0;
  34.   };
  35. };
  36. template <class T> class arbre
  37. {
  38. private:
  39. int Haut;
  40. int NbElmt;
  41. public
  42. noeud<T> *Racine;
  43. noeud<T> *Ajouter(T &Info);
  44. arbre();
  45. ~arbre();
  46. };
  47. class Position
  48. {
  49. private:
  50.   unsigned long long n;
  51.   int Nb;
  52.   unsigned int Positions[10];
  53.   void *Contenant;
  54. public:
  55.   void SetPos(int Pos){Positions[0] = Pos;};
  56.   void SetN(unsigned long long N){n = N;};
  57.   unsigned long long GetN(){return n;};
  58.   int GetNb(){return Nb;};
  59.   int GetPos(int i){return Positions[i];};
  60.   void SetParent(void *C) {Contenant = C;};
  61.   void *GetParent(){return Contenant;};
  62.  
  63.   Position()
  64.   {
  65.    Nb = 0;
  66.    n = 0;
  67.   }
  68.  
  69.   void Afficher()
  70.   {
  71.    cout << "Nb "<<n<<" -> "<< Nb <<" fois ";
  72.    for (int i = 0; i < Nb; i++)
  73.     cout <<"["<<Positions[i]<<"] ";
  74.    cout <<endl;
  75.   }
  76.  
  77.   Position &operator = (Position &p)
  78.   {
  79.    Positions[Nb++] = p.Positions[0];
  80.    n = p.n;
  81.   }
  82.  
  83.   bool operator == (Position &p)
  84.   {
  85.    if (p.n == n) 
  86.    {
  87.     if (Nb == 1) PositionsRedondantesG[NbPositionsG++] = this;
  88.     Positions[Nb++] = p.Positions[0];
  89.     return true;
  90.    }
  91.    return false;
  92.   }
  93.  
  94.   bool operator < (Position &p)
  95.   {
  96.    if (n < p.n) return true;
  97.    return false;
  98.   }
  99.  
  100.   bool operator > (Position &p)
  101.   {
  102.    if (n > p.n) return true;
  103.    return false;
  104.   }
  105. };
  106. template <class T> void noeud<T>::Vider()
  107. {
  108. if (fd) fd->Vider();
  109. if (fg) fg->Vider();
  110. if (Nb <= 1) delete this;
  111. else Info.Afficher();
  112. }
  113. template <class T> void noeud<T>::Reequilibrer(noeud *&Lien, int des)
  114. {
  115. noeud *FG=NULL, *FD = NULL;
  116. bool DoubleRotation = false;
  117. if (des > 0)
  118. {
  119.   if (fg->dq >= 0)
  120.   {
  121.    RotationDroite(Lien);
  122.    if (Lien->dq == 1) Lien->fd->dq = Lien->dq = 0;
  123.    else Lien->dq = -1, Lien->fd->dq = 1;
  124.   }
  125.   else
  126.   {
  127.    RotationGaucheDroite(Lien);
  128.    DoubleRotation = true;
  129.    FG = Lien->fg;
  130.    FD = Lien->fd;
  131.   }
  132. }
  133. else
  134. {
  135.   if (fd->dq <= 0)
  136.   {
  137.    RotationGauche(Lien);
  138.    if (Lien->dq == -1) Lien->fg->dq = Lien->dq = 0;
  139.    else Lien->fg->dq = -1, Lien->dq = 1;
  140.   }
  141.   else
  142.   {
  143.    RotationDroiteGauche(Lien);
  144.    DoubleRotation = true;
  145.    FG = Lien->fd;
  146.    FD = Lien->fg;
  147.   }
  148. }
  149. if (DoubleRotation)
  150. {
  151.   switch(Lien->dq)
  152.   {
  153.    case 1: FG->dq = 0;
  154.        FD->dq = -1;
  155.    break;
  156.    case -1:FG->dq = 1;
  157.        FD->dq = 0;
  158.    break;
  159.    case 0: FG->dq = FD->dq = 0;
  160.   }
  161.   Lien->dq = 0;
  162. }
  163. }
  164. template <class T> noeud<T> *noeud<T>::Ajouter(T &Info, noeud *&Lien, int &G)
  165. {
  166. noeud<T> *R;
  167. if (Info > noeud::Info)
  168. {
  169.   if (fd) R = fd->Ajouter(Info, fd, G);
  170.   else  R = fd = new noeud(Info), G = 1;
  171.   if (G) dq--;
  172.   if (dq >= 0) G = 0;
  173.   if (dq == -2) Reequilibrer(Lien, dq), G=0;
  174. }
  175. else if (Info < noeud::Info)
  176. {
  177.   if (fg) R = fg->Ajouter(Info, fg, G);
  178.   else  R = fg = new noeud(Info), G = 1;
  179.   if (G) dq++;
  180.   if (dq <= 0) G = 0;
  181.   if (dq == 2) Reequilibrer(Lien, dq), G=0;
  182. }
  183. else
  184. {
  185.   noeud::Info==Info;
  186.   Nb++;
  187.   return NULL;
  188. }
  189. return R;
  190. }
  191. template <class T> void noeud<T>::RotationDroite(noeud *&Q)
  192. {
  193. noeud *P = Q->fg;
  194. Q->fg = P->fd;
  195. P->fd = Q;
  196. Q = P;
  197. }
  198. template <class T> void noeud<T>::RotationGauche(noeud *&P)
  199. {
  200. noeud *Q = P->fd;
  201. P->fd = Q->fg;
  202. Q->fg = P;
  203. P = Q;
  204. }
  205. template <class T> void noeud<T>::RotationGaucheDroite(noeud *&R)
  206. {
  207. RotationGauche(R->fg);
  208. RotationDroite(R);
  209. }
  210. template <class T> void noeud<T>::RotationDroiteGauche(noeud *&R)
  211. {
  212. RotationDroite(R->fd);
  213. RotationGauche(R);
  214. }
  215. template <class T> noeud<T> *arbre<T>::Ajouter(T &Info)
  216. {
  217. int G = 0;
  218. noeud<T> *N;
  219. if (Racine == NULL)
  220. {
  221.   Racine = new noeud<T>(Info);
  222.   NbElmt++;
  223.   return Racine;
  224. }
  225. else
  226. {
  227.   N = Racine->Ajouter(Info, Racine, G);
  228.   if (N) NbElmt++;
  229.   return N;
  230. }
  231. }
  232. template <class T> arbre<T>::arbre()
  233. {
  234. NbElmt = 0;
  235. Racine = NULL;
  236. Haut = 0;
  237. }
  238. template <class T> arbre<T>::~arbre()
  239. {
  240. if (Racine) Racine->Vider();
  241. }
  242.  
  243.   inline void alea(unsigned long &rand){
  244.       static unsigned long r = SEED;
  245.       rand = r = 1664525UL * r + 1013904223UL;
  246.   } 
  247.  
  248.   int remplit_t(char *Tampon, const int N)
  249.   {
  250.  
  251.       unsigned long r;
  252.       char buf[20] = "";
  253.    
  254.       for (int i = 0; i < N; i+= 5)
  255.         {
  256.             do alea(r); while (r < 10000UL);
  257.             sprintf(&Tampon[i], "%u", r);
  258.         }
  259.   } 
  260.  
  261. int lmin = 7, lmax = 15;
  262.  
  263. int main(int argc, char *argv[])
  264. {
  265. char *Tampon;
  266. unsigned long long f;
  267. char Tmp;
  268. unsigned int i, j, k, t, v;
  269. int Nb;
  270. int PosTmp;
  271. int NbPositionsTmp;
  272. Position ** PositionsTmp;
  273. PositionsRedondantesG = new Position *[N];
  274. NbPositionsG = 0;
  275.  
  276. Tampon = new char[N];
  277. remplit_t(Tampon, N);
  278. arbre<Position> *Arbre = new arbre<Position>;
  279. Position Temp;
  280. j = 7;
  281. for (i = 0; i < N-j; i++)
  282. {
  283.   Tmp = Tampon[i+j];
  284.   Tampon[i+j] = 0;
  285.   f = atoll(&Tampon[i]);
  286.   Tampon[i+j] = Tmp;
  287.   Temp.SetN(f);
  288.   Temp.SetPos(i);
  289.   Arbre->Ajouter(Temp);
  290. }
  291. for (t = 8; t <= 15; t++)
  292.   cout <<"nombres de "<<t-1<<"  chiffres --------------" <<endl;
  293.   delete Arbre;
  294.   Arbre = new arbre<Position>;
  295.  
  296.   NbPositionsTmp = NbPositionsG;
  297.   PositionsTmp = PositionsRedondantesG;
  298.  
  299.   if (NbPositionsTmp)
  300.   {
  301.    PositionsRedondantesG = new Position *[NbPositionsTmp];
  302.    NbPositionsG = 0;
  303.  
  304.    for (i = 0; i < NbPositionsTmp; i++) 
  305.    {
  306.     Nb = PositionsTmp[i]->GetNb();
  307.  
  308.     for (j = 0; j < Nb; j++)
  309.     {
  310.      PosTmp = PositionsTmp[i]->GetPos(j);
  311.    
  312.      if (N - PosTmp > t)
  313.      {
  314.      Tmp = Tampon[PosTmp+t];
  315.      Tampon[PosTmp+t] = 0;
  316.      f = atoll(&Tampon[PosTmp]);
  317.      Tampon[PosTmp+t] = Tmp;
  318.      Temp.SetN(f);
  319.      Temp.SetPos(PosTmp);
  320.      Arbre->Ajouter(Temp);
  321.      }
  322.     }
  323.    }
  324.    for (i = 0; i < NbPositionsTmp; i++)
  325.     delete (noeud<Position> *) PositionsTmp[i]->GetParent();
  326.    delete PositionsTmp;
  327.   }
  328. }
  329. cout <<"nombres de "<<t-1<<"  chiffres --------------" <<endl;
  330. delete Arbre;
  331. if (NbPositionsTmp)
  332.   for (i = 0; i < NbPositionsTmp; i++)
  333.    delete (noeud<Position> *) PositionsTmp[i]->GetParent();
  334.   delete PositionsTmp;
  335. }
  336. delete [] Tampon;
  337. return EXIT_SUCCESS;
  338. }


 
il est vrai que mon cas est très limité au problème (j'ai juste pris les données du problème). Si on veut passer à un n indéfini ou des caractères, il suffit de faire une classe qui récupère m paquets de 64bits (qui peuvent être convertis à partir de caractères sur leur code ascii), et de surdéfinir les opérateurs de comparaison qui compareront un ensemble de paquet.  
Je conçois que ce n'est pas réutilisable, mais il fallait préciser que n pouvait augmenter au delà de 15... Cependant, les modifications sont très vite faites. Ptet que si j'ai le temps, je le ferai. De plus, je viens de penser à une méthode qui mélangerait table de hachage et arbres. La table de hachage servant d'index dans l'arbre, réduirait la complexité d'insertion (et de recherche). Par rapport à ton exemple, je pense qu'il manque d'efficacité par rapport à la fonction de hachage qui est trop compliquée par rapport aux données. Il faudrait plutot faire une table de hachage avec 10 millions d'entrées environ et trouver une fonction de répartition (la fction de hachage) qui suive une loi normale... Mais bon, c'est facile à dire, et plus difficile à trouver la fonction de répartition. Surtout que cette dernière dépend des données qui dans notre cas ne sont pas connues à l'avance.
Mais en trichant, tu pourrais calculer les distributions des répétitions pour en déduire la fonction de répartition adéquate... mais ça serait adapté uniquement à ton jeu de données. Sinon,il existe un outil gnu qui permet de calculer une fonction de hachage à partir des données, mais je ne me souviens plus de ce que c'est. Je cherche, et je le dis cet aprèm.

n°720424
el muchach​o
Comfortably Numb
Posté le 10-05-2004 à 11:49:56  profilanswer
 

assyrium a écrit :


Par rapport à ton exemple, je pense qu'il manque d'efficacité par rapport à la fonction de hachage qui est trop compliquée par rapport aux données. Il faudrait plutot faire une table de hachage avec 10 millions d'entrées environ et trouver une fonction de répartition (la fction de hachage) qui suive une loi normale... Mais bon, c'est facile à dire, et plus difficile à trouver la fonction de répartition. Surtout que cette dernière dépend des données qui dans notre cas ne sont pas connues à l'avance.
Mais en trichant, tu pourrais calculer les distributions des répétitions pour en déduire la fonction de répartition adéquate... mais ça serait adapté uniquement à ton jeu de données.


 
C'est aussi un peu ce que j'ai pensé, que ma fonction de hachage plombait mes perfs. Mais je n'ai pas voulu me prendre la tête et j'ai choisi la première qui me tombait sous la main (enfin la première en qui on puisse faire un minimum de confiance).
 

Citation :

Sinon,il existe un outil gnu qui permet de calculer une fonction de hachage à partir des données, mais je ne me souviens plus de ce que c'est. Je cherche, et je le dis cet aprèm.


 
Ce ne serait pas un truc nommé gperf ("a perfect hash generator" ) par hasard ?
gperf est inclus dans libstdc++. Un petit google donne aussi ggperf.
http://www.cs.ucla.edu/~jkong/publ [...] gperf.html
Apparemment, les deux ne peuvent être utilisés que pour un petit nombre d'entrées (<100000).

Citation :

The major reason why ggperf acts better is that the algorithm used by gperf is out-of-date. When the number of input keys is greater than 100, gperf becomes unbearably slow and liable to crash. ggperf is robust even when the number of input keys becomes very large. Because Java's integer is 32-bit, the upper limit of the number of input keys is really not a significant problem.
 
Due to the non-linear complexity of Czech's algorithm, ggperf will become slower when number of input keys increases. On a SPARCstation 4 system running Solaris 2.4 with 64M main memory, ggperf can generate perfect hash function for the top 100 words of /usr/dict/words in 10 seconds, top 1,000 words in 40 seconds, top 2,000 words in 150 seconds, and top 3,000 words in 400 seconds. Anyway, this result is impossible to be accomplished in GNU's gperf.  
Part of the poor performance of ggperf on very large input is relevant to the performance of Java. I have implemented ggperf in both Java and C. On the same SPARCstation 4 system, the implementation in C can generate perfect hash function for UNIX's /usr/dict/words file (25143 keys) in 500 seconds.


 
Plus proche de ce dont j'ai besoin serait plutôt :
http://burtleburtle.net/bob/hash/doobs.html
mais l'auteur dit que FNV_hash est plus rapide. Après quelques recherches, il semble que c'est un des meilleurs compromis qualité/simplicité/vitesse.
 
J'ai sous la main une version optimisée de mon code, qui exploite la remarque de Kristoph, mais je suis bloqué par un bug concernatn la suppression d'entrées dans une hash_map. Quand je fais un hash_map.erase(it), l'itérateur it est irrémédiablement perdu. Il semblerait que je sois obligé de recopier ma table dans une liste.
 
ps : tu n'étais pas obligé de recopier ton code à nouveau, il suffisait d'éditer l'ancien message... ;)


Message édité par el muchacho le 10-05-2004 à 13:46:28
n°720603
assyrium
Posté le 10-05-2004 à 14:20:03  profilanswer
 

C'est bien le programme gperf auquel je pensais, que j'avais utilisé pour trouver une fonction de hashage pour des positions de jeu d'échecs, mais sans grand succés, car je l'avais lancé sur un fichier de plus d'1 Go, et au bout d'une semaine, il n'avait toujours pas fini...
J'avais pas vu qu'on pouvait éditer nos messages, j'ai découvert ce forum il y a qqs jours.

n°720610
el muchach​o
Comfortably Numb
Posté le 10-05-2004 à 14:32:24  profilanswer
 

assyrium a écrit :

C'est bien le programme gperf auquel je pensais, que j'avais utilisé pour trouver une fonction de hashage pour des positions de jeu d'échecs, mais sans grand succés, car je l'avais lancé sur un fichier de plus d'1 Go, et au bout d'une semaine, il n'avait toujours pas fini...
J'avais pas vu qu'on pouvait éditer nos messages, j'ai découvert ce forum il y a qqs jours.


 
Ah, alors bienvenue.  :hello:  
Je suis moi-même assez récent ici. Il y a quelques trucs très intéressants ici, si on cherche un peu.

n°2134068
antigone57
Posté le 30-03-2012 à 22:24:16  profilanswer
 

Citation :

[quotemsg=708222,1,101896]J'ai vu que certains aimaient bien les petits problèmes.
 
Alors voilà, je me lance donc en espérant que celui-là ne fera pas un bide complet. :D  
 
Le problème est simple : on a une séquence de 5 millions de chiffres aléatoires dans un tableau.
 
1er problème : (facile) trouver toutes les répétitions de n chiffres successifs dans le tableau. Les écrire dans un fichier txt, ainsi que leurs positions. On fera cette recherche pour toutes les séquences où : 7 <= n <= 15


 
Bonjour,  
 
Ce problème m'intéresse, ou plutôt sa résolution.
Il pourrait me permettre de trouver des répétitions de n chiffres dans une liste (n variant de 2 à la taille de la liste - 1).
Ceci pour une application en biologie (les nombres représenteraient des délais de réponse de neurones dans un enregistrement).
Comme je ne suis pas très familière avec le C++ mais plutôt avec le python ou R , serait il possible de récupérer un algorithme de votre solution, plus facile à recoder ensuite dans un autre langage?
 
Je vous remercie de votre aide.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Recherche de chaineRecherche d'imprimantes réseau en PHP
Recherche cours et didacticiels: JSP/Servlet/JavaBeans - Struts - MVC2[Java WebStart]Recherche d'un tutorial
[C++] recherche tutorial COMPLET et SERIEUX sur DLL win32Comment passer d'une séquence d'images BMP à une video ?
Recherche APIfonction de recherche de fichier en C [LINUX]
éviter les doublons[Access97] Recherche avec l'option "tous" (zone de liste modifiable)
Plus de sujets relatifs à : [Concours] Recherche de doublons dans une séquence


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR