|
Publicité ' | ||||||||||||||||||||||||
|
|
#101 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 965 ![]() |
tout a l'air de bien fonctionner
les performances (g++ avec option -O2) + n=21 => 4 ms + n=54 => 92 ms + n=70 => 1 s + n=100 => 48s ![]() pour infos, nous allons faire un récapitulatif avec les codes et les perfs... ![]() temporairement, ce post de benchmarks peut vous donner une idée... |
|
|
00
|
|
|
#102 | ||
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Ok, ma version a en fait toujours été buggué... Mon idée de départ était fausse
![]() J'ai corrigé, mais les performances tombent un peu... Faut que je parte à la recherche d'une nouvelle idée. Snif snif, les langages fonctionnels reprennent la tête ![]() ![]() Code C++ :
__________________
Je ne répondrai à aucune question technique en privé |
||
|
|
00
|
|
|
#103 | |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 6 ![]() |
Citation:
Je ne suis pas juste pénible par plaisir, c'est une question fondamentale quand on développe du code : faire en sorte que ceux qui l'utilisent aient confiance. |
|
|
|
00
|
|
|
#104 | |||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Citation:
Si on ajoute le parcours des chemins, sa solution n'est pas tellement (ou meme pas du tout?) meilleure. En fait on peut meme dire que les autres solutions parcourent aussi le meme DAG sans prendre la peine de le construire. Autre proposition en C++ -- qui itere toujours sur toutes les solutions --, en utilisant une representation qui comprime les 1 finaux. On peut pousser cette idee plus loin en utilisant du RLE pour tous les elements ou une representation des comptes (donc avec beaucoup de 0, ca ne va vraissemblablement pas apporter grand chose). Code c++ :
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|||
|
|
00
|
|
|
#105 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 437 ![]() |
Citation:
Citation:
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
||
|
|
00
|
|
|
#106 | |
![]() ![]() Inscription : septembre 2003 Messages : 4 437 ![]() |
Citation:
voir ici
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
|
|
|
00
|
|
|
#107 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Je rajoute une implémentation en Haskell, elle n'est pas destinée à être rapide (ce qu'elle n'est pas vraiment, enfin elle doit être au niveau des codes OCaml de Gorgonite à peu près), mais elle est belle (de mon point de vue
Code :
De plus sa portée est plus générale que la plupart des programmes présents ici car elle permet d'entrer une liste d'entiers utilisables, elle résout de façon très élégante et très efficace le problème du menu (que pouvez vous vous acheter à la carte pour une somme donnée ?) (plus connu sous le nom de knapsack). (Malheureusement la solution n'est pas de moi, je reproduis de mémoire une fonction dont j'ai vu la définition sur une mailing-list en réponse à ce webcomic (très fun pour les informaticiens par ailleurs)) -- Jedaï |
||
|
|
00
|
|
|
#109 | |
|
Membre émérite
![]() Inscription : mai 2004 Messages : 738 ![]() |
Citation:
(je sais, j'ai pas de proposition sous la main... J'vais peut-être en donner plus tard)
|
|
|
|
00
|
|
|
#110 | ||||
|
Membre confirmé
![]() |
Coucou tout le monde, je savais pas quoi faire cette apres-midi alors j'ai essayé de faire la mienne. En OCaml (très impur mais mon but n'était pas de le faire pur
Pour l'appeler : ./partP -n 64, ajouter -debug pour voir toutes les solutions et leur nombre, et si vous rediriger vers /dev/null il vous donnera quand même le nombre de solutions sur la sortie err. Compilé avec ocamlopt -unsafe (mais le -unsafe m'a quasimment rien fait gagner) : Code :
Le code OCaml : Code :
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
||||
|
|
00
|
|
|
#111 | ||||
![]() ![]() yan verdavaineIngénieur expert Inscription : mars 2004 Messages : 9 870 ![]() |
Bonjour,
en regardant le code millie http://www.developpez.net/forums/sho...0&postcount=55 j'ai vue qu'il y avait encore une optimisation a faire. Et pour tester je l'ai refait en utilisant la STL. Grosse déception, c'est moins rapide sous GCC même sans rajouter l'optimisation : Code :
le voila avec la STL Code C++ :
merci |
||||
|
|
00
|
|
|
#112 |
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
En fait, mon code est faux, il me manque des parties
![]() En tout cas, ce qui est sûr, c'est que ma solution où j'étais partie sera peut être au final plus rapide, mais j'ai passé un maximum de temps à résoudre le problème en amont alors que les solutions de bases fonctionnels laissent tout le travail au programme. Mais il doit y avoir des versions fonctionnels plus réfléchies, faudrait que je relise les quelques pages.
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#113 | |||
|
Membre confirmé
![]() |
Euh, la mienne est très réfléchie ! Je peux la réécrire en fonctionnel pur et elle reste tout à fait réfléchie : en remplaçant le tableau de taille constante sur lequel l'algo travaille par une liste de couples (n,k) représentant de manière condensée la partition où k est présent n fois, et en les générant à l'envers pour profiter d'un meilleur sharing (les petits facteurs de la partition changent souvent sans que les gros ne changent). C'est forcément plus lent que l'autre à cause des allocations et des copies en plus, mais ça reste efficace.
Citation:
Code :
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|||
|
|
00
|
|
|
#114 | |
![]() ![]() yan verdavaineIngénieur expert Inscription : mars 2004 Messages : 9 870 ![]() |
Citation:
J'ai pas du voir où c'était ecrit... Ben tans pis (c'était surtout pour voir comment le réécrire avec la STL et verifier que c'etait plus, ou au moins aussi, rapide... Il y as juste les versions fonctionnelle qui sont correcte? |
|
|
|
00
|
|
|
#115 | |||
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Citation:
__________________
Je ne répondrai à aucune question technique en privé |
|||
|
|
00
|
|
|
#116 | ||
![]() ![]() yan verdavaineIngénieur expert Inscription : mars 2004 Messages : 9 870 ![]() |
Bon ben,
vu que j'avais recodé un algo faux, j'ai fait ma propre solution en récursive avec C++ ![]() Code C++ :
|
||
|
|
00
|
|
|
#117 |
![]() ![]() yan verdavaineIngénieur expert Inscription : mars 2004 Messages : 9 870 ![]() |
Pour les version fonctionnelles qui font de super score, il créé un arbre dont les solutions sont tous les trajet/graph entre la base et les feuilles. C'est bien cela?
Malheureusement leur score correspond uniquement à la création de cette arbre, non? Si c'est bien cela, ne devrait il pas ajouter les parcours pour que l'on puisse réellement comparer les différent résultats? |
|
|
00
|
|
|
#118 |
|
Membre confirmé
![]() |
Si tu parles de la version d'alex pi, oui, et il y a je sais pas combien de posts où il est question de cela au cours de cette discussion
Les miennes visitent toutes les solutions en revanche, et leur fonctionnement est à peu près le même que celui de JMB, à savoir : * on part de la décomposition triviale n = n * on prend le premier terme à droite k qui soit > 1 dans la décomposition (s'il n'y en a pas, on a terminé) * on le remplace par (k-1) + ... + (k-1) + r où (k-1) est présent q fois et où q(k-1)+r est la division euclidienne de (k+tous les 1 qui sont à droite) par (k-1), on a donc une nouvelle décomposition qui est la plus grande possible, tout en étant plus petite que la précédente (dans l'ordre lexicographique) * on retourne à l'étape 2 Cet algo permet de visiter toutes les décompositions où les entiers sont rangés dans l'ordre décroissant, de n à 1 + 1 + .... + 1, dans l'ordre inverse de l'ordre lexicographique donc. Dans sa 2ème version, JMB optimise en ne stockant pas les 1, il stocke juste le nombre de 1 dans remainder. Dans ma deuxième version, je généralise cette idée pour tous les entiers de la décomposition (pour minimiser la taille de mes listes). Et dans mes 2 versions, je traite spécialement le cas où k = 2 puisqu'il est fréquent et simple (idée donnée par Knuth dans le Volume 4 Fascicule 3 du Art of Computer Programming, by the way). Voilou
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|
|
00
|
|
|
#119 |
![]() ![]() yan verdavaineIngénieur expert Inscription : mars 2004 Messages : 9 870 ![]() |
ok, merci, je vais essayer de comprendre
![]() Par contre j'ai n'ai pas trop compris le temps de tes résultats... pour 100 tu arrive à 5.236s ??!!!! tu as comparrai par rapport au code C++ sur t'as machine? Sinon c'est marrant, mon code donne le même ordre de résultat que celui de JMB mais il ne fait pas la même chose
|
|
|
00
|
|
|
#120 |
|
Membre confirmé
![]() |
J'arrive même a 2.6s sur la version impérative qui travaille à espace mémoire constant ; et non je n'ai pas compilé la version C++ chez moi, de tte façon j'ai pas un Cray chez moi c'est un AMD64 assez standard (et je n'utilise qu'un core)
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com