L'application principale de LSH est de fournir un algorithme efficace de recherche des plus proches voisins.
L'algorithme donne une méthode de construction d'une famille LSH G utilisable, c'est-à-dire telle que P1≫P2, et ceci à partir d'une famille LSH F de départ. L'algorithme a deux paramètres principaux : le paramètre de largeur k et le nombre de tables de hachage L.
Pré-traitement
En pré-traitement, l'algorithme définit donc une nouvelle famille G de fonctions de hachage g, où chaque fonction g est obtenue par concaténation de k fonctions h1,...,hk de F, i.e., g(p) = [h1(p),...,hk(p)]. En d'autres termes, une fonction de hachage aléatoire g est obtenue par concaténation de k fonctions de hachage choisies aléatoirement dans H.
L'algorithme construit ensuite L tables de hachage, correspondant chacune à une fonction de hachage g. La j table de hachage contient alors les points de M hachés par la fonction gj. Seules les positions non-vides des tables de hachage sont conservées, en utilisant un hachage standard des valeurs de gj(p). Les tables de hachage résultats n'ont alors que n entrées (non-vides), réduisant l'espace mémoire par table à O(n) et donc O(n**L) pour la structure de donnée totale.
Recherche d'un point requête q
Pour un point requête q, l'algorithme itère sur les L fonctions de hachage g. Pour chaque g considérée, on trouve les points hachés à la même position que le point requête q dans la table correspondante. Le processus s'arrête dès qu'un point r est trouvé tel que d(r,q)≤cR.
Étant donné les paramètres k et L, l'algorithme a les garanties de performance suivantes :
- temps de pré-traitement : O(nLk**t), où t est le temps d'évaluation d'une fonction h∈F d'un point p;
- mémoire : O(n**L)
- temps de requête : O(L(kt+dnP2k));
- l'algorithme a une probabilité de trouver un point à une distance c**R de la requête q (si un tel point existe) avec une probabilité Ω(min{1,LP1k}).