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

Algorithmes et structures de données Discussion :

Algorithme permettant de garder les meilleurs score


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut Algorithme permettant de garder les meilleurs score
    Bonjour,

    J'ai un programme en C qui calcule des scores. Et je veux garder que un certain nombre de meilleurs scores.
    Le problème c'est que j'ai environ 10^9 score a calculer et je voudrais garder les 10^6 meilleurs. Je cherche une methode qui soit relativement optimisée (sinon, mes calculs risques de prendre des heures ...).

    Merci

  2. #2
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    ce que je trouve le plus simple :

    * conserver les scores dans une liste triée (ou alors les trier au dernier moment)

    * les "meilleurs scores" sont simplement les 10^6 premieres cases du tableau


    Ceci revient donc à faire un algorithme de tri.

  3. #3
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut
    Les scores calculés arrivent au fur et a mesure. Je les ai pas tous d'un coup. Et je veux pas non plus tous les stocker (10^9 double en memoire ca fait mal ... )

    Pour le tableau ordoné de score : j'y ai deja pense. Mon programme pour l'instant utilse un tableau de pointeur vers des structures contenant les scores (et d'autres infos utiles).
    Quand un nouveau score arrive, je regarde si il est superieur au minimum du tableau (le dernier element du tableau). Si oui, je regarde la ou il faut l'inserer (recherche par dichotomie) puis je fais un memmove pour inserer le nouveau element.

    J'ai pense a une autre methode : une liste chainee, qui a l'avantage de pas avoir trop de déplacement de données en memoire, cependant, pour chercher la ou il faut inserer un nouveau element, il faut parcourir la liste linéairement ....

  4. #4
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Bonjour,

    As tu pensé à utiliser un gestionnaire base données pour manipuler tes scores.

    C'est un outil adapté pour ce genre de choses

  5. #5
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par mhtrinh Voir le message
    Les scores calculés arrivent au fur et a mesure. Je les ai pas tous d'un coup. Et je veux pas non plus tous les stocker (10^9 double en memoire ca fait mal ... )
    oui pardon ^^, je n'avais pas fait le "calcul".

    et bien c'est tout vu : si ça arrive au fur et à mesure il est clair que tu gardes une liste des meilleurs scores triée continuellement comme tu l'as dit.

    J'ai pense a une autre methode : une liste chainee, qui a l'avantage de pas avoir trop de déplacement de données en memoire, cependant, pour chercher la ou il faut inserer un nouveau element, il faut parcourir la liste linéairement ....
    c'est faisable si c'est surtout pour apprendre à programmer, et en théorie des lectures sont plus rapides que des écritures mais

    Citation Envoyé par icer Voir le message
    Bonjour,

    As tu pensé à utiliser un gestionnaire base données pour manipuler tes scores.

    C'est un outil adapté pour ce genre de choses
    c'est mieux je pense aussi

  6. #6
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut
    Bonjour,
    Pouvez vous detailler un peu plus sur les gestionnaires de bases de données de scores ?? Sur les bases de donnees, je connais MySql ... mais je vois pas comment je vais l'utiliser avec mon programme en C ....
    Merci.

  7. #7
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    Bonjour,

    je vais peut etre dire une betise mais voila comment je ferai...
    a chaque fois qu'un score est calculé il est trié est placé dans le tableau a la bonne place,
    une fois que les 10^6 premiers score sont arrivé le tableau est plein. A partir de ce moment la on teste chaque nouveau score avec celui se trouvant dans la derniere case du tableau (donc le plus petit) puis si il est plus grand on décale comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    long i=(10^6)-2;
    while(score>tab[i]){
    tab[i+1]=tab[i];
    i--;
    }
    tab[i]=score;
    ainsi tu conserve a chaque fois les 10^6 meilleurs scores.

    a +

  8. #8
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Bonjour,
    Pouvez vous detailler un peu plus sur les gestionnaires de bases de données de scores ?? Sur les bases de donnees, je connais MySql ... mais je vois pas comment je vais l'utiliser avec mon programme en C ....
    Merci.
    D'une façons général les systèmes de gestion de base données (MySql entre autres (qui n'est pas le meilleur à mon gout) ) serve à stocker, récupérer, modifier des informations. De plus ces systèmes sont déja optisés pour la recherche, le trie... Pour ton jeux, où tu as énormément de scores à gérer, tu pourrais déléguer cette tache à un gestionnaire de base de données et tu n'aurais plus à de soucier de la façons dont tes données sont stockées, triées... le language SQL permettant d'avoir cette abstraction.

    Ces systèmes proposes des API pour manipuler les données avec SQL depuis un language de programmation, inclue le language c. Tu n'aura donc aucune difficulté majeur à l'intégré à ton jeux.

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Garder a tout moment les 10^6 meilleurs scores deja vu. Plutot qu'un tableau trie, prendre une structure telle qu'un tas (le tas du heap sort, pas celui qui gere la memoire). Pour le probleme tel que decrit, utiliser un db telle que MySql revient a prendre une presse hydraulique destinee a l'emboutissage a froid de pieces metalliques pour casser une noix.

  10. #10
    Membre habitué
    Homme Profil pro
    Dev C++, CUDA
    Inscrit en
    Mai 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Dev C++, CUDA
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2005
    Messages : 83
    Points : 129
    Points
    129
    Par défaut
    Youpi !!! C'est bien ce que je cherche : HEAP SORT
    Un algo qui permet de maintenir un minimum (ou maximum) sans se soucier du reste.
    J'ai donc fait un heap avec le minimum à la racine de l'arbre.

    Merci Jean-Marc.Bourguet. Il est pas VIP par hazard

  11. #11
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Pour le probleme tel que decrit, utiliser un db telle que MySql revient a prendre une presse hydraulique destinee a l'emboutissage a froid de pieces metalliques pour casser une noix.
    Pour continuer dans l'analogie de Jean-Marc.Bourguet, je dirais que quand on a pas de casse-noix, une presse hydraulique destinée à l'emboutissage à froid de pièces métalliques peut être très utile pour casser sa malheureuse noix, au lieu d'extraire du fer à partir de sable brut, de se fabriquer un moule de casse-noix en argile et d'y coulé le fer fondu à 1000°C pour fabriquer son casse-noix adapté à la taille de notre malheureuse noix.

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par icer Voir le message
    Pour continuer dans l'analogie de Jean-Marc.Bourguet, je dirais que quand on a pas de casse-noix, une presse hydraulique destinée à l'emboutissage à froid de pièces métalliques peut être très utile pour casser sa malheureuse noix, au lieu d'extraire du fer à partir de sable brut, de se fabriquer un moule de casse-noix en argile et d'y coulé le fer fondu à 1000°C pour fabriquer son casse-noix adapté à la taille de notre malheureuse noix.
    Tu prends deux cailloux. Toujours mieux que la presse hydraulique: tu as fini avant de lire les consignes de securite.

    Il fut un temps ou j'avais a me battre contre le NIH. Maintenant il faut se battre aussi contre la tendance a batir des usines a gaz sous pretexte d'eviter le NIH.

    (Au fait, on est sur le forum algorithme).

  13. #13
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Je suis aussi pour la simplicité :
    Utiliser des solutions toutes faites, c'est aussi faire simple.

    Qu'est-ce que le NIH ?

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par icer Voir le message
    Je suis aussi pour la simplicité :
    Utiliser des solutions toutes faites, c'est aussi faire simple.
    Pas toujours. Et dans ce cas ci, utiliser une db est dans le pas.

    Qu'est-ce que le NIH ?
    Not Invented Here

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/06/2015, 11h46
  2. Réponses: 4
    Dernier message: 12/05/2013, 12h32
  3. Réponses: 6
    Dernier message: 15/06/2011, 14h43
  4. Trouver les meilleurs scores de chaque joueur
    Par nycolas dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/08/2009, 07h09
  5. Fichier séquentiel : garder les 5 meilleurs joueurs
    Par theterro dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/05/2006, 11h59

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