Seleziona due numeri che sommano a , usando il tempo di query sub-lineare


9

Ecco il problema del vicino più vicino.

Dati i reali (molto grande !), Più il bersaglio reale , trova e cui SUM è il più vicino a . Consentiamo una ragionevole pre-elaborazione / indicizzazione di (fino a ), ma al momento della query (data ), il risultato dovrebbe essere restituito molto velocemente (ad es. tempo).a1,,annpaiajpa1,,anO(nlogn)pO(logn)

(Esempio più semplice: se volessimo solo il SOLO più vicino a , ordineremmo offline, , quindi eseguiremo la ricerca binaria al momento della query, ).aipa1,,anO(nlogn)O(logn)

Soluzioni che non funzionano:

1) Ordina offline, quindi al momento della query, inizia da entrambe le estremità e sposta due puntatori verso l'interno ( http://bit.ly/1eKHHDy ). Non va bene, a causa del tempo di query .a1,,anO(n)

2) Ordina offline, quindi al momento della query, prendi ogni ed esegui la ricerca binaria di un "amico" che lo aiuti a riassumere qualcosa di simile a . Non va bene, a causa del tempo di query .a1,,anaipO(nlogn)

3) Ordina tutte le coppie offline, quindi esegui una ricerca binaria. Non buono, a causa della pre-elaborazione .(a1,,an)O(n2)

Grazie!

ps. Ulteriori generalizzazioni necessarie per la pratica: (1) e devono essere vettori 50-dimensionali, (2) "vicino" per essere la distanza del coseno vettoriale e (3) -best coppie più vicine-quella-somma, non solo 1-migliore.a1,,anpk


Esiste un limite al tempo di pre-elaborazione o alla quantità di spazio che possiamo usare dopo la pre-elaborazione? Se siamo limitati allo spazio , hai qualche motivo per credere che possa essere risolto in, diciamo, tempo? Mi sembra terribilmente improbabile. O(n)O(lgn)
DW,

La pre-elaborazione è limitata a O ( log ). Ho aggiornato la dichiarazione del problema. nn
Kevin,

Non ho motivo di credere che l'interrogazione possa essere veloce, ma molti risultati utili per i vicini più vicini (kd-alberi, hashing sensibile alla località, ecc.) Mi sembrano contrariamente intuitivi. Una soluzione approssimativa che utilizza l'hash sensibile alla località andrebbe bene per un uso pratico.
Kevin,

Risposte:


17

Questo è quasi certamente impossibile.

Supponiamo di poter risolvere il problema con il tempo di preelaborazione e il tempo di query . Poi c'è un semplice algoritmo per risolvere il problema 3SUM —Dato un insieme di numeri reali, tre elementi si sommano a zero? —In time. tutti i numeri, quindi per ogni numero troviamo il valore di che è il più vicino a ; se corrisponde esattamente a , abbiamo trovato una soluzione al problema 3SUM.P(n)Q(n)nP(n)+nQ(n)akai+ajakak

Tuttavia, l'algoritmo più veloce noto per 3SUM viene eseguito nel tempo e questo algoritmo è ampiamente ipotizzato ottimale. Inoltre, esiste un limite inferiore corrispondente a in un modello di calcolo dell'albero delle decisioni limitato ma naturale. Per i set di numeri interi , ci sono un po 'di algoritmi subquadratic-time che "giocare con bit", ma anche nel modello RAM intero, 3sum si congettura di richiedere tempo .O(n2)Ω(n2)Ω(n2/polylogn)

Quindi, supponendo che la congettura sia corretta, il tuo problema richiede un tempo di preelaborazione (quasi) quadratico o un tempo di query (quasi) lineare.


2

Se durante la pre-elaborazione è possibile utilizzare spazio illimitato e tempo illimitato, la seguente soluzione soddisfa i requisiti:

  • Durante la pre-elaborazione, calcola il set e archivia questo set in ordine ordinato. Questo set può essere generato e ordinato in tempo e ci vuole spazio per memorizzarlo.{ai+aj:1ijn}O(n2)O(n2)

  • Ora per rispondere a una query (per trovare dove è il più vicino possibile a ), è sufficiente effettuare una ricerca binaria in questo elenco ordinato. Ci vorrà tempo.ai,ajai+ajpO(lgn)

Se questa soluzione non è accettabile, è necessario esaminare più attentamente i requisiti e modificare la domanda di conseguenza.


Ciao e grazie! Ma la tua soluzione è la stessa della mia soluzione n. 3, che è problematica a causa del tempo di pre-elaborazione O (n ^ 2). Nel mio caso, n è molto grande (ad es. 1m) e devo evitare le operazioni O (n ^ 2).
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.