Selecione dois números que somam

9

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 )a1,,annpaiajpa1,,anO(nlogn)pO(logn)

(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 )aipa1,,anO(nlogn)O(logn)

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 .a1,,anO(n)

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 )a1,,anaipO(nlogn)

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 )(a1,,an)O(n2)

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 ka1,,anpk

Kevin
fonte
Existe um limite no tempo de pré-processamento ou na quantidade de espaço que podemos usar após o pré-processamento? Se estamos limitados ao espaço , você tem algum motivo para acreditar que ele pode ser resolvido em, digamos, tempo? Isso me parece muito improvável. O ( lg n )O(n)O(lgn)
DW
O pré-processamento é limitado a O ( log ). Eu atualizei a declaração do problema. nnn
21413 Kevin
Não tenho nenhum motivo para acreditar que a consulta possa ser rápida, mas muitos resultados úteis para os vizinhos mais próximos (árvores-kd, hash sensível à localidade etc.) parecem contra-intuitivamente bons para mim. Uma solução aproximada usando o hash sensível à localidade seria adequada para uso prático.
21713 Kevin

Respostas:

17

Isso é quase certamente impossível.

P(n)Q(n)nP(n)+nQ(n)akai+ajakak

O(n2)Ω(n2)Ω(n2/polylogn)

Portanto, supondo que a conjectura esteja correta, seu problema requer tempo de pré-processamento (quase) quadrático ou tempo de consulta (quase) linear.

Jeffε
fonte
2

Se você pode usar espaço e tempo ilimitados durante o pré-processamento, a solução a seguir atende aos seus requisitos:

  • {ai+aj:1ijn}O(n2)O(n2)

  • ai,ajai+ajpO(lgn)

Se essa solução não for aceitável, você deve refletir sobre seus requisitos com mais cuidado e editar a pergunta de acordo.

DW
fonte
Olá e obrigado! Mas sua solução é igual à minha solução nº 3, o que é problemático devido ao tempo de pré-processamento de O (n ^ 2). No meu caso, n é muito grande (por exemplo, 1m) e devo evitar operações O (n ^ 2).
21713 Kevin