Je voudrais savoir s'il existe une fonction des nombres à n bits aux nombres à n bits qui présente les caractéristiques suivantes:
- doit être bijectif
- Les deux et devrait être assez rapide calculable
- doit renvoyer un nombre qui n'a pas de corrélation significative avec son entrée.
La justification est la suivante:
Je veux écrire un programme qui fonctionne sur des données. Certaines informations des données sont stockées dans une arborescence de recherche binaire où la clé de recherche est un symbole d'un alphabet. Avec le temps, j'ajoute d'autres symboles à l'alphabet. Les nouveaux symboles obtiennent simplement le prochain numéro gratuit disponible. Par conséquent, l'arborescence aura toujours un petit biais vers des touches plus petites, ce qui provoque un rééquilibrage plus important que je ne le pense.
Mon idée est de réduire les nombres de symboles avec telle sorte qu'ils soient largement répartis sur toute la plage de . Étant donné que les numéros de symbole n'ont d'importance que lors de l'entrée et de la sortie, ce qui ne se produit qu'une seule fois, l'application d'une telle fonction ne devrait pas être trop coûteuse.[ 0 , 2 64 - 1 ]
J'ai pensé à une itération du générateur de nombres aléatoires Xorshift, mais je ne connais pas vraiment un moyen de l'annuler, bien que cela devrait théoriquement être possible.
Quelqu'un connaît-il une telle fonction?
Est-ce une bonne idée?
Réponses:
Vous pouvez utiliser le hachage de Fibonacci , à savoir
.hF(k)=k⋅5√−12−⌊k⋅5√−12⌋
Pour vous obtenez n nombres distincts par paires (environ) répartis uniformément dans [ 0 , 1 ] . En mettant à l'échelle [ 1 .. M ] et en arrondissant (vers le bas), vous obtenez des nombres répartis uniformément dans cet intervalle.k=1,…,n n [0,1] [1..M]
Par exemple, ce sont mis à l'échelle [ 0..10000 ] (séquence d'origine gauche, trié à droite):hF(1),…,hF(200) [0..10000]
Ceci est un exemple de ce que Knuth appelle le hachage multiplicatif . Pour la taille du mot de l'ordinateur, un certain entier relativement premier à w et M le nombre d'adresses nécessaires, nous utilisonsw A w M
comme fonction de hachage. Ce qui précède suit avec (assurez-vous de pouvoir le calculer avec une précision suffisante). Bien que cela fonctionne également avec tout autre nombre irrationnel en plus deϕ-1, c'est l'un des deux seuls nombres qui conduisent aux nombres "les plus uniformément répartis".A/w=ϕ−1=5√−12 ϕ−1
Pour en savoir plus, consultez L'art de la programmation informatique , volume 3 de Donald Knuth (chapitre 6.4 à partir de la page 513 de la deuxième édition). En particulier, vous découvrirez pourquoi les nombres résultants sont distincts par paires (au moins si ) et comment calculer la fonction inverse si vous utilisez A et w naturels au lieu de ϕ - 1 .n≪M A w ϕ−1
la source
Pour les entrées bits, cette fonction fonctionne:k
Ceci est réversible, en ce que , et a des paires non séquentielles { n , m } , n < m , où h a s h ( m ) < h a s h ( n ) . Attention, la sortie et l'entrée peuvent être corrélées, surtout si votre entrée est en { 1 , … , 2 ⌈ khash(hash(n))=n {n,m},n<m hash(m)<hash(n) .{1,…,2⌈k2⌉−1}
Réf: Fonction de hachage réversible
la source