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

  FORUM HardWare.fr
  Programmation
  C++

  Algorithme de bits...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Algorithme de bits...

n°341746
Phlos
Posté le 24-03-2003 à 18:51:02  profilanswer
 

Code :
  1. /*
  2.     Algorithme repondant a la question "Combien de fois un word (16 bits) peut t-il avoir la moitié de ses bits identiques ?"
  3. */
  4. #define NombreBits 16
  5. int main()
  6. {
  7.     int A, B, taille, i, I;
  8.     char binaire[NombreBits];
  9.    
  10.     A = 0;
  11.     taille = sizeof(binaire) - 1;
  12.     for (i = 0; i <= taille; i++)  binaire[i] = '0';
  13.    
  14.     do
  15.     {
  16.         for (i = 0; i <= taille; i++)
  17.         {
  18.                 I = taille - i;
  19.                 if (binaire[I] == '0')
  20.                 {
  21.                         binaire[I] = '1';
  22.                         if (I != 0) while ((I != 0) && (I < taille) && (I++)) binaire[I] = '0';
  23.                         break;
  24.                 }
  25.         }
  26.        
  27.         for (i = 0, B = 0; i <= taille; i++) if (binaire[i] == '1') B++;
  28.         if (B == (NombreBits / 2)) A++;
  29.     } while (B != sizeof(binaire) - 1);
  30.    
  31.     printf("Un nombre binaire de %u bits a la moitie de ses bits identiques %u fois !\n", NombreBits, A);
  32.     getch();
  33.        
  34.     return 0;
  35. }


 
Peut-on l'optimiser un peu plus ?  :??:  
 
Merci d'avance.  :hello:

mood
Publicité
Posté le 24-03-2003 à 18:51:02  profilanswer
 

n°341760
bjone
Insert booze to continue
Posté le 24-03-2003 à 19:01:19  profilanswer
 

bah déjà la question est pas claire je trouve...

n°341765
Phlos
Posté le 24-03-2003 à 19:03:43  profilanswer
 

Par optimisisation, je veux dire code plus petit et plus rapide  :p  
 
Si tu parles de la question a laquelle l'algo doit répondre, ben euh tu comprends pas le francais alors  :whistle:

n°341782
Evadream -​jbd-
Posté le 24-03-2003 à 19:14:44  profilanswer
 

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.


Message édité par Evadream -jbd- le 24-03-2003 à 19:30:06
n°341800
Taz
bisounours-codeur
Posté le 24-03-2003 à 19:30:33  profilanswer
 

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.  
 
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!/((n/2)!)
 
Je pense que ca doit être ca.

je suis presque d'accord sauf que j'aurais plutot vu un arrangement

n°341867
Evadream -​jbd-
Posté le 24-03-2003 à 20:03:14  profilanswer
 

Je suis une mega kiche en dénombrement :D
 
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à.


Message édité par Evadream -jbd- le 24-03-2003 à 20:03:43
n°341879
Evadream -​jbd-
Posté le 24-03-2003 à 20:14:59  profilanswer
 

++Taz > j'ai édite mon post à 19:30:06 lorsque tu postais, pas de mauvaises intentions de ma part !

n°342172
bjone
Insert booze to continue
Posté le 25-03-2003 à 00:10:27  profilanswer
 

Phlos a écrit :

Par optimisisation, je veux dire code plus petit et plus rapide  :p  
 
Si tu parles de la question a laquelle l'algo doit répondre, ben euh tu comprends pas le francais alors  :whistle:  


 
bah désolé, je dois avoir du mal aujoud'hui, mais si tu supprimmes la question je vais avoir encore plus de mal  :wahoo:

n°342202
Phlos
Posté le 25-03-2003 à 07:28:26  profilanswer
 

BJOne a écrit :


 
bah désolé, je dois avoir du mal aujoud'hui, mais si tu supprimmes la question je vais avoir encore plus de mal  :wahoo:  


 :??:

n°342838
bjone
Insert booze to continue
Posté le 25-03-2003 à 17:40:16  profilanswer
 


 
ha merde tu l'avais pas supprimé désolé je suis en mode -ait du mal- cette semaine  [:ddt]

mood
Publicité
Posté le 25-03-2003 à 17:40:16  profilanswer
 

n°342897
Phlos
Posté le 25-03-2003 à 19:16:23  profilanswer
 

BJOne a écrit :


 
ha merde tu l'avais pas supprimé désolé je suis en mode -ait du mal- cette semaine  [:ddt]  


 
 [:mr marron derriere]

n°342951
Evadream -​jbd-
Posté le 25-03-2003 à 20:47:51  profilanswer
 

Un petit feedback sur les solutions proposées ?

n°343314
Phlos
Posté le 26-03-2003 à 00:03:41  profilanswer
 

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 "!"  :D  
 
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])  :??:  
 
 :whistle:  
 
 :hello:


Message édité par Phlos le 26-03-2003 à 00:04:03
n°343321
Evadream -​jbd-
Posté le 26-03-2003 à 00:14:19  profilanswer
 

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 :D
 
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.


Message édité par Evadream -jbd- le 26-03-2003 à 00:16:21
n°343326
Kristoph
Posté le 26-03-2003 à 00:39:55  profilanswer
 

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é

n°343357
Taz
bisounours-codeur
Posté le 26-03-2003 à 06:47:12  profilanswer
 

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 :
  1. const double PI=3.1415926535897932384626433832795;


Message édité par Taz le 26-03-2003 à 08:38:33
n°343360
Max peigne
Posté le 26-03-2003 à 07:37:17  profilanswer
 

++Taz a écrit :

approximation de __je_sais_plus_qui__
 
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 :
  1. const double PI=3.1415926535897932384626433832795;




 
...quand n tend vers + l'infini (mauvais souvenirs de sup/spé inside).


Message édité par Max peigne le 26-03-2003 à 07:41:23
n°343367
Taz
bisounours-codeur
Posté le 26-03-2003 à 08:18:40  profilanswer
 

Max Peigne a écrit :


 
...quand n tend vers + l'infini (mauvais souvenirs de sup/spé inside).

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


Message édité par Taz le 26-03-2003 à 08:38:18
n°343397
Max peigne
Posté le 26-03-2003 à 09:24:51  profilanswer
 

++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
 
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


 
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.

n°344181
Taz
bisounours-codeur
Posté le 26-03-2003 à 17:22:11  profilanswer
 

>>> stirling(16)
20814114415223.137
 
>>> factoriel(16)
20922789888000L
 
ça passe à peu pres [:spamafote]

n°344298
Phlos
Posté le 26-03-2003 à 18:27:57  profilanswer
 

Je comprends rien [:meganne]
 
Mais merci  :jap:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Algorithme de bits...

 

Sujets relatifs
Questions sur structure d'images 24 bits[C/C++]Algorithme d'indentation
[ théorie ] - L'algorithme le plus balèze que vous connaissez ?[Algo/C] Grande chaine de caractères pour test d'un algorithme
[Delphi, Pascal] Manipulation de bitsune question de poids de bits
algorithme de calcul de distance de deux histogrammesProgramme de dessin d'algorithme
Histoire de la solution de l'algorithme de Perterson ?quelqu'un aurait un site sur l'algorithme?
Plus de sujets relatifs à : Algorithme de bits...


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