Algorithme de bits... - C++ - Programmation
Marsh Posté le 24-03-2003 à 19:03:43
Par optimisisation, je veux dire code plus petit et plus rapide
Si tu parles de la question a laquelle l'algo doit répondre, ben euh tu comprends pas le francais alors
Marsh Posté le 24-03-2003 à 19:14:44
Si tu as n bits (n étant pair), tu veux savoir le nombre de mots à n bits différents ayant la moitié de ses bits à 1.
C'est le nombre de choix de n/2 places parmi n, soit le nombre de combinaison de n/2 parmi n. Formule des C(n,k)
C'est donc : n!/((n-n/2)!*(n/2)!) = n!/((n/2)!*(n/2)!)
Je pense que ca doit être ca.
Marsh Posté le 24-03-2003 à 19:30:33
Evadream -jbd- a écrit : Si tu as n bits (n étant pair), tu veux savoir le nombre de mots à n bits différents ayant la moitié de ses bits à 1. |
je suis presque d'accord sauf que j'aurais plutot vu un arrangement
Marsh Posté le 24-03-2003 à 20:03:14
Je suis une mega kiche en dénombrement
Mais prenons un exemple sur 4 bits, je vois 6 possibilités :
0011
0101
0110
1001
1010
1100
Soit 4!/[(4-2)!*2!] = 4*3/2 = 6
Non ? Putain je me fais peur là.
Marsh Posté le 24-03-2003 à 20:14:59
++Taz > j'ai édite mon post à 19:30:06 lorsque tu postais, pas de mauvaises intentions de ma part !
Marsh Posté le 25-03-2003 à 00:10:27
Phlos a écrit : Par optimisisation, je veux dire code plus petit et plus rapide |
bah désolé, je dois avoir du mal aujoud'hui, mais si tu supprimmes la question je vais avoir encore plus de mal
Marsh Posté le 25-03-2003 à 07:28:26
BJOne a écrit : |
Marsh Posté le 25-03-2003 à 17:40:16
ReplyMarsh Posté le 25-03-2003 à 19:16:23
ReplyMarsh Posté le 26-03-2003 à 00:03:41
Evadream -jbd- a écrit : Un petit feedback sur les solutions proposées ? |
Oui excusez moi
En fait j'ai pas vraiment compris la solution mathématiques, je ne sais plus a quoi correspond le signe "!"
Mais pour mon algorithme, on peut l'optimiser (parceque la vous avez repondu a la question de l'algo mais pas a ma question [optimisation de l'algo])
Marsh Posté le 26-03-2003 à 00:14:19
Y'a pas mal
Ok, je suis d'accord qu'on a pas repondu à la question de l'amélioration de l'algo =)
Je me suis pas plongé dedans, mais ca fait un peu bricolage pour essayer toutes les combinaisons possibles. Je veux pas être méchant hein, ca m'arrive de faire des trucs TRES laids sur des problèmes tout con, tu as qu'à faire une recherche avec mon pseudo
La, tout de suite, je vois pas. Si tu pouvais le décrire en quelques lignes pour en donner le principe !
Sinon le signe "!" correspond à la factorielle. Par exemple, 5! = 5 *4*3*2*1 = 120
Ca augmente TRES rapidement.
Marsh Posté le 26-03-2003 à 00:39:55
Bien sur qu'on a repondu a la question de l'algo. La reponse est : n!/(n/2)! qui est plus efficace en terme de complexite que l'algo indiqué ci dessus.
Rappel, n!/(n/2)! = produit pour i allant de (n/2)+1 à n de i. Une petite boucle for et c'est reglé
Marsh Posté le 26-03-2003 à 06:47:12
approximation de Stirling
factoriel(n) ~= sqrt(2*n*PI)*pow(n/E, n)
edit: PI et E ne sont pas des constantes standards alors je te conseille soir le #define ou mieux, la definition de constante
Code :
|
Marsh Posté le 26-03-2003 à 07:37:17
++Taz a écrit : approximation de __je_sais_plus_qui__
|
...quand n tend vers + l'infini (mauvais souvenirs de sup/spé inside).
Marsh Posté le 26-03-2003 à 08:18:40
Max Peigne a écrit : |
evidemment sinon pas besoin d'approximation. cela dit, si on veut un resultat flottant en double, en utilisant la formule de Stirling, l'overflow est à n=171, et si on veut un resultat entier en unsigned int sur 32 bits, donc en utilisant la méthod enaturelle, l'overflow, c'est à n=13
je crois donc qu'une formule d'approximation est la bienvenue
perso, quand j'ai fait quelques calculs avec des factoriels, les factoriels de 0 à 13 était des cosntantes précalculées et pour les autres, bien obligé de passer par Stirling
Marsh Posté le 26-03-2003 à 09:24:51
++Taz a écrit : evidemment sinon pas besoin d'approximation. cela dit, si on veut un resultat flottant en double, en utilisant la formule de Stirling, l'overflow est à n=171, et si on veut un resultat entier en unsigned int sur 32 bits, donc en utilisant la méthod enaturelle, l'overflow, c'est à n=13 |
En fait, ce que je voulais souligner, c'est que lui a besoin de n=16 si j'ai bien suivi. Le problème est de savoir si l'approximation est bien valable pour un n si faible.
Marsh Posté le 26-03-2003 à 17:22:11
>>> stirling(16)
20814114415223.137
>>> factoriel(16)
20922789888000L
ça passe à peu pres
Marsh Posté le 24-03-2003 à 18:51:02
Peut-on l'optimiser un peu plus ?
Merci d'avance.