J'ai quelques millions de valeurs 32 bits. Pour chaque valeur, je veux trouver toutes les autres valeurs dans une distance de 5 brouillage. Dans l'approche naïve, cela nécessite des comparaisons , que je veux éviter.
J'ai réalisé que si je traitais simplement ces valeurs 32 bits comme des entiers et triais la liste une fois, alors les valeurs qui ne différaient que dans les bits les moins significatifs se retrouvaient très proches les unes des autres. Cela me permet d'avoir une "fenêtre" ou une plage de nombres plus courte à l'intérieur de laquelle je peux effectuer des comparaisons par paires réelles pour la distance exacte de brouillage. Cependant, lorsque 2 valeurs varient uniquement dans les bits d'ordre supérieur, elles se retrouvent en dehors de cette "fenêtre" et apparaissent aux extrémités opposées de la liste triée. Par exemple
11010010101001110001111001010110
01010010101001110001111001010110
serait très éloigné, même si leur distance de hamming est 1. Puisque, la distance de hamming entre 2 valeurs est préservée lorsque les deux sont tournées, je me suis dit qu'en faisant 32 rotations à gauche puis en triant la liste à chaque fois, il est probable que 2 valeurs finira assez près dans la liste triée dans au moins l'un d'entre eux.
Bien que cette approche me donne de bons résultats, j'ai du mal à établir officiellement l'exactitude de cette approche.
Étant donné que je recherche des valeurs correspondantes ayant une distance de brouillage ou moins, ai-je vraiment besoin de faire toutes les rotations 32 bits? Par exemple, si et que la taille de ma fenêtre est de 1000, je dois le faire à des rotations de 24 bits maximum car même si le bit errant est apparu dans l'un des 8 bits d'ordre inférieur, les nombres résultants ne différeront pas de plus de 1000.
A[i].close
Réponses:
Comme indiqué, votre approche est problématique, car si 2 bitmaps ont des différences régulièrement espacées, alors dans toute rotation, il y aura des différences sur certains bits de poids fort.
Information additionnelle:
la source
La réponse de minar est excellente et est probablement la bonne approche pour ce problème particulier. Cependant, je mentionnerai une autre approche possible:
Vous pouvez utiliser une fonction de hachage sensible à la localité (LSH). Une fonction de hachage sensible à la localité est conçue de telle sorte que si sont proches dans la distance de Hamming, alors . Si vous avez un tel hachage , vous pouvez stocker toutes vos valeurs dans une table de hachage (en utilisant la fonction de hachage et le hachage ouvert), puis vous pourrez très rapidement trouver toutes les paires de valeurs proches à distance de Hamming . Il existe différentes techniques pour construire un LSH; vous pouvez consulter les références sur ce sujet pour trouver plusieurs candidats.H x,y H(x)=H(y) H H
Cela dit, pour votre problème particulier (avec les paramètres spécifiques que vous avez mentionnés), je m'attends à ce que les deux algorithmes de minar se révèlent meilleurs en pratique que n'importe quel schéma basé sur LSH. Je mentionne cela uniquement au cas où d'autres lecteurs viendraient ici à cette question avec un problème similaire, mais avec des paramètres différents où LSH pourrait avoir plus de sens.
la source