3 Réponses :
Oui, il y a une solution let code (pas optimal, fait un recomutation inutile, et tout cela ne pouvait pas faire pour éviter Overflow): p> testé dans une boucle pour Vérifier la sortie ici . P> P> log n code>.
n code> avoir
k code> bits défini, le bit le plus significatif étant en position
p code> (Commençant de compter les positions de 0, donc
2 ^ p <= n <2 ^ (p + 1) code>). Ensuite, il y a
pck code> (coefficient de binomiel, également
choisir (p, k) code>) façons de placer
k code> bits dans les positions
0, ..., p-1 code>, tous ces numéros avec exactement
k code> kits inférieurs à
n code>. Si
k == 1 code>, c'est tout, sinon il reste les chiffres avec
k code> Définir les bits et le
p code> -Tème jeu de bits inférieur à
n code> à considérer. Ceux-ci peuvent être comptés en déterminant le rang de
n-2 ^ p code>. P>
0 <= n <10 ^ 8 code> Pour vérifier les erreurs sans aucune inadéquation trouvée. P >
Pour référence, PCK code> fait référence au coefficient de binomiel .
L'approche a l'air bien. Mais avez-vous vérifié N = 5 & N = 6? Il échoue ici.
@Aashish, je n'ai pas encore fait tous les détails, donnez-moi quelques minutes pour écrire du code;)
@Danielfischer: [met le chapeau de l'éditeur OEIS] Si vous travaillez sur les détails, vous pouvez l'ajouter comme un commentaire à A068076; Je vais l'examiner moi-même.
@DSM Détails élaborés, A068076 est Rank (N) -1 Code>. Mais comment puis-je ajouter un commentaire sur OEIS? Devrais-je m'inscrire là-bas?
@Danielfischer: Ouais (lien sur la page principale). Après cela, lorsque vous vous connectez, un bouton "Modifier" apparaît au-dessus d'une entrée. Vous apportez des modifications, un style semi-wiki, puis les proposer (un autre bouton). Ensuite, ils sont examinés par les éditeurs et éventuellement approuvé par l'un des éditeurs en chef comme moi.
@Danielfischer Comment est la complexité de temps LG N ici?
Il peut être résolu par des techniques de combinaison et de permutation.
f (n) = rang p>
Premier nombre de bits requis pour représenter N. en représentation binaire, le nombre peut être construit comme suit: p> maintenant, afin de trouver n code> (ou des nombres de bits en représentation binaire d'un nombre) dans une équation ci-dessus, nous pouvons supposer que ce sera
plancher (log2 (n)) + 1 code>. Par exemple, envisagez n'importe quel nombre, disons
118 code>, puis il peut être représenté par le sol (log2 (118)) + 1 = 7 bits. P>
>> rankN(3)
ans =
1
>> rankN(4)
ans =
3
>> rankN(7)
ans =
1
>> rankN(118)
ans =
18
>> rankN(6)
ans =
3
Comment classif (3) code peut-il être 2? C'est
11 code> en binaire; Le seul chiffre <= 3 avec 2 bits est 3 lui-même. Je penserais que 3,4,7, 118 aurait des rangs de 1,3,1,18.
Ouais, il y avait des erreurs dans mon script, mais la production est désormais disponible pour être [1, 3, 1, 21]
Je suis à peu près sûr que le rang (118) est seulement 18. Je pense que vous comptez des chiffres avec le même nombre de bits que 118 à 128 à partir de 119 à 128.
La représentation binaire de 118 est 1110110 code> 7 bits et contient 5 - 1s et 2 - 0s, donc
7 !!! / 5! * 2! = 21 code> qui correspond à mon script. Maintenant, le problème est réduit si ma formule de permutation est correcte ou non? Qu'en penses-tu?
Vous oubliez que 1111001 code>,
1111010 (code> et
1111100 code> sont des permutations valides, mais des numéros non valides, car ils sont tous plus grands que 118. C'est Pourquoi vous obtenez 21 lorsque la réponse est 18.
Merci de me faire remarquer..Je juste corrigé mon approche en outre.
Voici une implémentation O (logn) assez efficace qui effectue plusieurs ajouts parallèlement par étape: Il commence par 16 ajouts 2 bits, puis fait 8 ajouts 4 bits et bientôt. Il peut être étendu au fonctionnement avec des entiers de 64 bits en utilisant des masques plus longs et une étape supplémentaire: p>