Wybierz dwie liczby, które sumują się do , używając sublinearnego czasu zapytania


9

Oto problem najbliższego sąsiada.

Biorąc pod uwagę liczby rzeczywiste (bardzo duże !), Plus cel rzeczywisty , znajdź i których SUMA jest najbliższe . Umożliwiamy rozsądne wstępne przetwarzanie / indeksowanie (do ), ale w czasie zapytania (dane ) wynik powinien zostać zwrócony bardzo szybko (np. czas).a1,…,annpaiajpa1,…,anO(nlog⁡n)pO(log⁡n)

(Prostszy przykład: jeśli chcielibyśmy tylko POJEDYNCZEGO najbliższego , posortowalibyśmy offline, , a następnie przeszukaliśmy binarnie w czasie zapytania, ).aipa1,…,anO(nlog⁡n)O(log⁡n)

Rozwiązania, które nie działają:

1) Sortuj offline, a następnie w czasie zapytania zacznij od obu końców i przesuń dwa wskaźniki do wewnątrz ( http://bit.ly/1eKHHDy ). Nie dobrze, ze względu na czas zapytania .a1,…,anO(n)

2) Posortuj offline, a następnie w czasie zapytania, weź każdy i przeprowadź wyszukiwanie binarne dla „kumpla”, który pomoże sumować się do czegoś zbliżonego do . Nie dobrze, ze względu na czas zapytania .a1,…,anzajapO(nlog⁡n)

3) Posortuj wszystkie pary offline, a następnie przeprowadź wyszukiwanie binarne. Nie dobrze, ze względu na wstępne przetwarzanie .(za1,…,zan)O(n2))

Dzięki!

ps. Do uogólnienia potrzebne są dalsze uogólnienia: (1) i to wektory 50-wymiarowe, (2) „close” oznacza wektorową odległość cosinus i (3) najbliższe pary-suma, nie tylko 1 najlepszy.za1,…,zanpk


Czy istnieje limit czasu przetwarzania wstępnego lub ilości miejsca, które możemy wykorzystać po przetwarzaniu wstępnym? Jeśli ograniczamy się do przestrzeni , czy masz powód, by sądzić, że można ją rozwiązać na przykład w czasie ? To wydaje mi się strasznie mało prawdopodobne. O(n)O(lg⁡n)
— DW

Przetwarzanie wstępne jest ograniczone do O ( log ). Zaktualizowałem opis problemu. nn
— Kevin,

Nie mam żadnego powodu, aby sądzić, że zapytania mogą być szybkie, ale wiele przydatnych wyników dla najbliższych sąsiadów (drzewa kd, haszowanie wrażliwe na lokalizację itp.) Wydaje mi się sprzeczne z intuicją. Przydatne byłoby zastosowanie przybliżonego rozwiązania wykorzystującego haszowanie wrażliwe na lokalizację.
— Kevin,

Odpowiedzi:


17

Jest to prawie na pewno niemożliwe.

Załóżmy, że możesz rozwiązać problem z czasem wstępnego przetwarzania i czasem zapytania . Następnie istnieje prosty algorytm do rozwiązania problemu 3SUMA - biorąc pod uwagę zestaw liczb rzeczywistych, czy jakieś trzy elementy sumują się do zera? - w czasie . Wstępnie przetwarzamy wszystkie liczby, a następnie dla każdej liczby znajdujemy wartość najbliższą ; jeśli dokładnie pasuje do , znaleźliśmy rozwiązanie problemu 3SUM.P(n)Q(n)nP(n)+n⋅Q(n)zakaja+zajot-zak-ak

Jednak najszybszy znany algorytm dla 3SUM działa w czasie i ten algorytm jest powszechnie przypuszczany, że jest optymalny. Ponadto istnieje dopasowana dolna granica w ograniczonym, ale naturalnym modelu obliczeń drzewa decyzyjnego. W przypadku zestawów całkowitymi , są nieco algorytmy subquadratic, że „czas grać w gry z bitów”, ale także w modelach RAM całkowitą, 3SUM Przypuszcza wymagają Czas .O(n2))Ω(n2))Ω(n2)/polylogn)

Zakładając, że przypuszczenie jest poprawne, twój problem albo wymaga (prawie) kwadratowego czasu wstępnego przetwarzania, albo (prawie) liniowego czasu zapytania.


2

Jeśli podczas wstępnego przetwarzania można użyć nieograniczonej przestrzeni i nieograniczonego czasu, następujące rozwiązanie spełnia Twoje wymagania:

  • Podczas przetwarzania wstępnego oblicz zestaw i zapisz ten zestaw w posortowanej kolejności. Zestaw ten można wygenerować i posortować w czasie , a przechowywanie go zajmuje miejsce .{zaja+zajot:1≤ja≤jot≤n}O(n2))O(n2))

  • Teraz, aby odpowiedzieć na zapytanie (aby znaleźć gdzie jest tak blisko jak to możliwe), po prostu wykonaj wyszukiwanie binarne na tej posortowanej liście. To zajmie czas.zaja,zajotzaja+zajotpO(lg⁡n)

Jeśli to rozwiązanie jest nie do przyjęcia, musisz dokładnie przemyśleć swoje wymagania i odpowiednio zmodyfikować pytanie.


Cześć i dziękuję! Ale twoje rozwiązanie jest takie samo jak moje rozwiązanie nr 3, które jest problematyczne z powodu czasu wstępnego przetwarzania O (n ^ 2). W moim przypadku n jest bardzo duże (np. 1 m) i muszę unikać operacji O (n ^ 2).
— Kevin,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.