Je suis curieux de savoir s'il existe un moyen de stocker un hachage d'un ensemble multiple d'entiers possédant les propriétés suivantes, idéalement:
- Il utilise O (1) espace
- Il peut être mis à jour pour refléter une insertion ou une suppression dans le temps O (1)
- Deux collections identiques (c.-à-d. Des collections contenant les mêmes éléments avec les mêmes multiplicités) doivent toujours avoir la même valeur et deux collections distinctes doivent avoir des valeurs différentes avec une probabilité élevée (c.-à-d. Que la fonction est indépendante ou indépendante par paire).
Une première tentative consisterait à stocker le produit modulo de manière aléatoire au sein des hachages des éléments individuels. Cela satisfait 1 et 2, mais il n'est pas clair si cela, ou une variante proche, satisferait 3.
J'ai initialement posté ceci sur StackOverflow .
* Les propriétés 1 et 2 pourraient être légèrement assouplies, par exemple, sur O (log n) ou sur un petit polynôme sous-linéaire. Le but est de voir si nous pouvons identifier plusieurs ensembles et tester de manière fiable l’égalité sans stocker les éléments eux-mêmes.
Réponses:
Si vous pensez que des ensembles vivent dans l’univers , il est assez facile de résoudre votre problème avec le temps de mise à jour de . Tout ce dont vous avez besoin est une fonction de hachage rapide pour un vecteur de nombres , avec des "mises à jour locales" rapides.[u] O(lgu) u
Le hachage de Wikipedia / Universal suggère , où est un nombre premier suffisant et est uniformément tiré de . Lorsque vous ajoutez ou supprimez l'élément , vous devez ajouter / soustraire du code de hachage, ce qui prend un temps utilisant divide and conquer pour l'exponentiation. Puisqu'un polynôme de degré ne peut avoir que des racines , la probabilité de collision pour deux ensembles distincts est de . Ceci peut être rendu très petit en prenant comme assez grand (par exemple,h(x⃗ )=(∑ui=1xiai)modp p a [p] i ai O(lgi) u u O(u/p) p p=u2 et vous travaillez en "double précision"). Si les ensembles sont beaucoup plus petits que , vous pouvez bien sûr commencer par réduire l'univers à un univers plus petit.[u]
Est-ce que quelqu'un connaît une solution avec une probabilité de collision lors d'un hachage allant de ? Cela devrait être possible.O(1/p) [p]
la source
Carter et Wegman couvrent cela dans New hash functions (Fonctions de hachage) et leur utilisation dans l'authentification et définissent l'égalité ; c'est très similaire à ce que vous décrivez. Une fonction de hachage commutative peut être mise à jour élément par élément pour les insertions et les suppressions, et les correspondances à haute probabilité, dans O (1).
la source
La qualité d’une fonction de hachage dépendra toujours des propriétés des éléments qu’elle doit hacher. Pouvez-vous dire quelque chose à ce sujet? Par exemple, votre suggestion de produit est probablement une mauvaise fonction de hachage si les éléments x_i de votre multiset ont généralement de nombreux petits facteurs premiers. Mais vous pouvez l’améliorer dans ce cas en prenant simplement le produit de tous les x_i + p mod q pour certains nombres premiers p et q.
la source
la somme nous permet d'avoir plusieurs occurrences de la même valeur
le xor nous permet d'avoir des ensembles qui totalisent le même montant
la source