3 Réponses :


7
votes

Oui, il y a une solution log n .

let n avoir k bits défini, le bit le plus significatif étant en position p (Commençant de compter les positions de 0, donc 2 ^ p <= n <2 ^ (p + 1) ). Ensuite, il y a pck (coefficient de binomiel, également choisir (p, k) ) façons de placer k bits dans les positions 0, ..., p-1 , tous ces numéros avec exactement k kits inférieurs à n . Si k == 1 , c'est tout, sinon il reste les chiffres avec k Définir les bits et le p -Tème jeu de bits inférieur à n à considérer. Ceux-ci peuvent être comptés en déterminant le rang de n-2 ^ p .

code (pas optimal, fait un recomutation inutile, et tout cela ne pouvait pas faire pour éviter Overflow): xxx

testé dans une boucle pour 0 <= n <10 ^ 8 Pour vérifier les erreurs sans aucune inadéquation trouvée.

Vérifier la sortie ici .


7 commentaires

Pour référence, PCK 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 . 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?



0
votes

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> xxx pré>

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


6 commentaires

Comment classif (3) 11 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 7 bits et contient 5 - 1s et 2 - 0s, donc 7 !!! / 5! * 2! = 21 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 , 1111010 et 1111100 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.



0
votes

Voici une implémentation O (logn) assez efficace qui effectue plusieurs ajouts parallèlement par étape: xxx

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: xxx


0 commentaires