Voici un problème de voisin le plus proche.
Étant donné les réels (très grand !), Plus le réel cible , trouver et dont la somme est la plus proche de . Nous autorisons un prétraitement / indexation raisonnable de (jusqu'à ), mais au moment de la requête (étant donné ), le résultat doit être renvoyé très rapidement (par exemple, heure). n p a i a j p a 1 , … , a n O ( n log n ) p O ( log n )
(Exemple plus simple: si nous voulions uniquement le SINGLE plus proche de , nous hors ligne, , puis ferions une recherche binaire au moment de la requête, ). p a 1 , … , a n O ( n log n ) O ( log n )
Solutions qui ne fonctionnent pas:
1) Triez hors ligne, puis au moment de la requête, commencez par les deux extrémités et déplacez deux pointeurs vers l'intérieur ( http://bit.ly/1eKHHDy ). Pas bon, en raison du temps de requête .
2) Triez hors ligne, puis au moment de la requête, prenez chaque et effectuez une recherche binaire pour un "copain" qui l'aide à additionner quelque chose proche de . Pas bon, en raison du temps de requête .a i p O ( n log n )
3) Triez toutes les paires hors ligne, puis effectuez une recherche binaire. Pas bon, à cause du prétraitement .O ( n 2 )
Merci!
ps. Autres généralisations nécessaires pour la pratique: (1) et pour être des vecteurs à 50 dimensions, (2) "close" pour être la distance du cosinus du vecteur, et (3) -les meilleures paires les plus proches-cette somme, pas seulement 1-meilleur. p k
Réponses:
C'est presque certainement impossible.
En supposant donc que la conjecture est correcte, votre problème nécessite soit un temps de prétraitement (presque) quadratique, soit un temps de requête (presque) linéaire.
la source
Si vous pouvez utiliser un espace et un temps illimités pendant le prétraitement, la solution suivante répond à vos besoins:
Si cette solution n'est pas acceptable, vous devez réfléchir plus attentivement à vos besoins et modifier la question en conséquence.
la source