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(nlogn)pO(logn)

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

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(nlogn)

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(lgn)
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)+nQ(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:1jajotn}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(lgn)

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.