Aqui está um problema do vizinho mais próximo.
Dados os reais (muito grande !), Mais o alvo real , encontre e cujo SUM seja o mais próximo de . Permitimos pré-processamento / indexação razoável de (até ), mas no momento da consulta (dado ), o resultado deve ser retornado muito rapidamente (por exemplo, tempo). n p um i um j p um 1 , ... , um n O ( N log N ) p O ( log n )
(Exemplo mais simples: se apenas o ÚNICO mais próximo de , classificaríamos offline, , em seguida, faríamos uma pesquisa binária no momento da consulta, ) p a 1 , … , a n O ( n log n ) O ( log n )
Soluções que não funcionam:
1) Classifique offline e, no momento da consulta, inicie pelas duas extremidades e mova dois ponteiros para dentro ( http://bit.ly/1eKHHDy ). Não é bom, devido ao tempo de consulta .
2) Classifique offline e, no momento da consulta, pegue cada e faça uma pesquisa binária de um "amigo" que ajude a somar algo próximo a . Não é bom, devido ao tempo de consulta .a i p O ( n log n )
3) Classifique todos os pares off-line e faça a pesquisa binária. Não é bom, devido ao pré-processamento de .O ( n 2 )
Obrigado!
ps. Generalizações adicionais necessárias para a prática: (1) e são vetores de 50 dimensões, (2) "fecham" a distância do cosseno do vetor e (3) melhor par mais próximo dessa soma, não apenas o melhor. p k
Respostas:
Isso é quase certamente impossível.
Portanto, supondo que a conjectura esteja correta, seu problema requer tempo de pré-processamento (quase) quadrático ou tempo de consulta (quase) linear.
fonte
Se você pode usar espaço e tempo ilimitados durante o pré-processamento, a solução a seguir atende aos seus requisitos:
Se essa solução não for aceitável, você deve refletir sobre seus requisitos com mais cuidado e editar a pergunta de acordo.
fonte