Une façon efficace de compter le nombre de 1 dans la représentation binaire d'un nombre en O(1) si vous avez assez de mémoire pour jouer avec. Il s'agit d'une question d'entretien que j'ai trouvée sur un forum en ligne, mais qui n'avait pas de réponse. Quelqu'un peut-il suggérer quelque chose, je ne vois pas comment le faire en O(1) temps ?
+1 pour la dénomination correcte de ce problème. Bien que je pense qu'une réponse complète indiquerait que même l'utilisation d'une table de consultation ne serait pas un temps O(1), car le temps de consultation d'une entrée dépend de la taille de l'entrée.
2 votes
La question veut donc que vous trichiez - une mémoire "suffisante" pourrait facilement être constituée de plus de bits qu'il n'y a d'atomes dans l'univers observable.
0 votes
Ne serait-il pas simplement un tableau de longueur MAX_INT ?
1 votes
Corrigez-moi si je me trompe - si nous avons un tableau [0..MAX_INT-1] où l'index est le nombre réel en entrée, et les données sont le nombre de 1 pour ce nombre (et disons qu'il est mis en œuvre via une mémoire adressable par le contenu), nous pourrions dire que nous avons un tableau [0..MAX_INT-1]. fr.wikipedia.org/wiki/Content-addressable_memory ) ne serait-elle pas O(1) ?
2 votes
C'est probablement la solution de l'entretien modèle, bien que je ne pense pas qu'elle puisse satisfaire un puriste parce qu'il est limité par la largeur de données de la mémoire adressable de la machine (disons 64 bits). Cela ne fonctionnerait pas pour les nombres > 2^64 et comme indiqué, la question n'impose pas cette restriction. Si la question était révisée pour dire "un nombre de 64 bits" alors oui, c'est une bonne solution.
0 votes
D'autre part, pour les nombres de 64 bits, les anciennes méthodes de comptage des bits sont également O(1) et n'utilisent presque pas de mémoire.