|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | ||||
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Une solution en C++, dont je suis pas très fier du code (d'ailleurs, si quelqu'un pondait ça dans un de mes projets, je le dégage sec
J'y ajouterai quelques explications et j'essayerai de rendre le code plus potable. Fonctionne parfaitement avec de grande valeur : Il y a des optimisations très bourrine sur la génération des combinaisons. Dernière version ici : http://www.developpez.net/forums/sho...0&postcount=55 Code C++ :
A partir, par exemple du vecteur : 4 1 1 1 genererSuivant génère successivement les combinaisons suivantes : 4 1 1 1 4 2 1 1 4 2 2 1 4 2 2 2 4 3 2 2 4 3 3 2 4 3 3 3 4 4 3 3 4 4 4 3 4 4 4 4 Code :
Je pense que niveau rapidité et utilisation mémoire, je bats tout le monde pour l'instant. Par contre, niveau longueur de code, c'est pas ça
__________________
Je ne répondrai à aucune question technique en privé |
||||
|
|
00
|
|
|
#22 | |||||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
Code :
|
|||||
|
|
00
|
|
|
#23 | |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Oui, mais regarde mon code plus haut. Il faut que a et foo soient mutuellement récursifs : a a besoin de foo pour l'init, et les valeurs stockées dans foo dépendent de a. Apparemment, on ne peut pas s'en sortir sans faire d'effet de bord (on initialise tout le tableau à [[]] et on le met à jour à chaque calcul).
Citation:
|
|
|
|
00
|
|
|
#24 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 436 ![]() |
Une solution en C itérative :
Elle est basée sur la décompisition du nombre n en une liste de n 1, et ensuite à partir de cette liste, et des listes obtenues suivantes, on fabrique de nouvelles listes en remplaçant à chaque fois deux nombres de valeurs différentes par leur somme. exemple pour 5 liste intiale [1 1 1 1 1] à partir de [1 1 1 1 1 1] [2 1 1 1] à partir de[2 1 1 1] [3 1 1] [2 2 1] à partir de [3 1 1] [4 1] [3 2] à partir de [2 2 1] [4 1] non insérée puisqu'existant déjà [3 2] non insérée puisqu'existant déjà a partir de [4 1] [5] à partir de [3 2] [5] non inséré puisqu'existant déjà à partir de [5] Arrêt puisque la longueur est 1 Code c :
décomposition de 10 : 42 solutions 0,000s décomposition de 20 : 627 solutions 0,000s décomposition de 30 : 5604 solutions 0,281s décomposition de 40 : 37 338 solutions 10,578s décomposition de 50 : 204 226 solutions 520,281s
__________________
"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
|
|
|
#25 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
En bref il s'agit d'un algorithme différent des nôtres... Moins lisible et moins naturel bien sûr. -- Jedaï |
|
|
|
00
|
|
|
#26 | ||
|
Expert Confirmé Sénior
![]() ![]() |
De même, voici ma solution type "itérateur", avec un unfoldr pour le transformer en liste ! Ce script a une consommation mémoire extrèmement faible évidemment (2 Mo à peu près) :
Code Haskell :
-- Jedaï |
||
|
|
00
|
|
|
#27 |
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
@trap D : Ta solution est super longue. La mienne te bat niveau temps je pense
J'ai quelques optimisations intéressante à ajouter.
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#28 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
-- Jedaï |
|
|
|
00
|
|
|
#29 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
pour infos, ces résultats viennent d'une compilation en bytecode (ocamlc), et non en format natif (ocamlopt) pour les résultats en natif (puisque les langages impératifs sont arrivés...) + 5ms pour 21 + 4s pour 54 + 1min 12s pour 70 (y a plus de stack overflow )une version avec mémorisation des listes déjà calculés : + n=21 => 2ms + n=54 => 657s + n=70 => 9s en comparaison le code c++ de millie donne ceci + 9ms pour 21 + 214ms pour 54 + 536ms pour 70 le code c++ de jean-marc bourguet (compilé avec g++ -O2) + n=21 => 4 ms + n=54 => 92 ms + n=70 => 1 s + n=100 => 48s algo naif en scheme par garulfo (compilé avec bigloo) : + 21 => 6ms + 54 => 3s + 70 => 51s le code haskell avec iterateur de jedai (compilé avec ghc) + 6ms pour 21 + 1,6s pour 54 + 13,8s pour 70 pour le code haskell de jedai "sans iterateur" (compilé avec ghc) + 3ms pour 21 + 450ms pour 54 + 5,6s pour 70 une version faite par alex_pi en ocaml (compilé avec ocamlopt) (solution contestée, ne fait pas la même chose que les autres) + n=21 => 3 ms + n=54 => 4 ms + n=70 => 4 ms + n=100 => 6 ms pour le code F#, si quelqu'un me trouve un compilateur pour Linux ![]() pour le code prolog, si quelqu'un sait "lancer" le programme de façon à ce qu'il calcule le nombre de solutions pour N passé en arguments (via la méthode que vous souhaitez), je suis preneur ![]() pour le code c, étant donné les résultats annoncés, je n'ai pas essayé de les confirmer
|
|
|
|
00
|
|
|
#30 | |||
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
D'ailleurs, dans la droite lignée de la liste infinie pour l'ensemble des n-uplets, voici une liste infinie pour l'ensemble des ensembles : Code :
-- Jedaï |
|||
|
|
00
|
|
|
#31 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
-- Jedaï |
|
|
|
00
|
|
|
#32 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
aucune optimisation... donc en fait, celle par défaut avec ton optimisation... haskell sans itérateur 21 0m0.002s 54 0m0.260s 70 0m3.108s haskell avec iterateur 21 0m0.002s 54 0m0.252s 70 0m3.115s |
|
|
|
00
|
|
|
#33 |
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Ah oui, tu as essayé avec -O3 avec ma version ?
Il y a des optimisations que je peux ajouter, j'essayerais de les mettre demain soir (ou ce soir si j'ai le temps).
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#34 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
forcemment, mais dans ce cas, chacun doit refléchir aux options les plus appropriées pour son programme... en n'activant aucune optimisation, ça restait "équitable" au sens, que seuls les choix par défaut de chaque compilateur étaient pris en compte code c++ millie avec -O3 21 0m0.002s 54 0m0.004s 70 0m0.008s |
|
|
|
00
|
|
|
#35 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
Evidemment le gros avantage de la version avec itérateur c'est l'occupation mémoire : 2 Mo pour 70 (en fait ça ne varie pas vraiment avec n) et 500 Mo dans la version sans itérateur ! Par ailleurs tu sembles avoir plus de RAM libre que moi, parce que je n'arrive pas à dépasser 64 avec ta version OCaml. Citation:
-- Jedaï |
||
|
|
00
|
|
|
#36 | |||||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
Code :
Citation:
![]() nb: je n'ai pas fait l'optimisation que tu proposais... j'essaierais mon histoire mutable dès que j'aurais rendu le code plus présentable ![]() Citation:
perso, je dirais que c'est le problème de ghc... parce qu'il y a aussi pas mal d'optimisations, qui pourrait rendre ocamlopt encore plus agressif
|
|||||
|
|
00
|
|
|
#37 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
Citation:
-- Jedaï |
||
|
|
00
|
|
|
#38 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
évidemment... si je devais comparer ghc à une machine virtuelle pour un "coreML" basé sur une machine de krivine (déjà fait, donc je peux parler |
|
|
|
00
|
|
|
#39 | ||||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Code :
Citation:
Je viens d'essayer sur une autre machine (qui a une vieille version Mono, et n'a pas F#), en faisant un scp du binaire généré sous Windows. J'ai comparé ta version Caml compilée avec ocamlopt et celle compilée par f#... ben, ocamlopt va bien plus vite (un facteur 10 sur les petits tests ; j'ai pas pu monter haut, la ram est très limitée ). Ca peut se comprendre, j'ai dû compiler pour .NET 1.1, sans les generics (ce qui ralentit beaucoup).J'ai voulu tester ma version avec la matrice lazy, mais le compilateur ne peut compiler ce code que pour .NET >= 2. :/ Bon, si quelqu'un peut tester avec des outils convenables, ce serait bien. Sinon, je vais tester sous Windows. J'ai juste à installer un compilateur Caml pour comparer. |
||||
|
|
00
|
|
|
#40 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
perso, j'ai mono sous linux, donc si tu me files le lien pour un compilateur F# qui tourne sur mono, je prends aussi |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com