Kompromis czasowo-przestrzenny dla problemu brakującego elementu

14

Oto dobrze znany problem.

Biorąc pod uwagę tablicę A[1n] dodatnich liczb całkowitych, wyprowadzaj najmniejszą dodatnią liczbę całkowitą spoza tablicy.

Problem można rozwiązać w przestrzeni i czasie O(n) : przeczytaj tablicę, śledź w przestrzeni O(n) czy wystąpiło 1,2,,n+1 poszukaj najmniejszego elementu.

Zauważyłem, że możesz wymieniać przestrzeń na czas. Jeśli masz O(nk)tylko pamięć, możesz to zrobić wkrundach i uzyskać czasO(kn). W szczególnym przypadku istnieje oczywiście algorytm kwadratowy o stałej przestrzeni.

Moje pytanie brzmi:

Czy jest to optymalny kompromis, tj. Czy timespace=Ω(n2) ? Ogólnie, w jaki sposób można udowodnić tego rodzaju granice?

Załóżmy model RAM z ograniczonym arytmetycznym i losowym dostępem do tablic w O (1).

Inspiracja do tego problemu: kompromis czasowo-przestrzenny dla palindromów w modelu z jedną taśmą (patrz na przykład tutaj ).

sdcvvc
źródło
2
Nie, możesz posortować tablicę w a następnie znaleźć brakującą liczbę (pierwsza liczba powinna wynosić 1, druga powinna wynosić 2, ... w przeciwnym razie znajdziesz) w O (n), to sortowanie można wykonać z miejscowym połączeniem oznacza O ( 1 ) dodatkową spację, więc czas spacja należy do O ( n log n )O(nlogn)O(1)O(nlogn) . Nie wiem, czy mam twój problem dokładnie, czy nie (z tego powodu nie odpowiedziałem, a także nie wiem, czy jest lepszy związek).
Zakładam, że dane wejściowe są tylko do odczytu. (Jeśli nie jest, problem można optymalnie rozwiązać w przestrzeni czas / przestrzeń O ( 1 ) : pomnóż wejście przez 2 i użyj parzystości, aby zasymulować O ( n ) / O ( n )O(n)O(1)O(n)/O(n) algorytm )
sdcvvc
Jaki jest algorytm stałej przestrzeni? Wygląda na to, że potrzebujesz miejsca na n 2lognn2 która jest dla mnie „oczywista”
Xodarap,
W tym modelu liczby całkowite wielkości słów przyjmują ; jeśli jest to wygodniejsze, możesz odpowiedzieć na dowolny wariant pytania z czasem spacja = Ω ( n 2O(1)dla pewnej stałejk. timespace=Ω(n2logkn)k
sdcvvc,
@ sdcvvc, nie rozumiem twojego algorytmu , czy mógłbyś opisać go nieco bardziej? (zwróć uwagę, że wczytywanie do bitów zajmuje O ( log n ) ). O(n)/O(1)O(logn)

Odpowiedzi:

2

Można to zrobić za pomocą operacji na słowach O(nlogn) i O(1) słów pamięci (odpowiednio O(nlog2n) i pamięć O(logn) w modelu pamięci RAM na poziomie bitów). Rzeczywiście, rozwiązanie będzie oparte na poniższej obserwacji.

Powiedzmy, że jest n0 parzystych i n1 nieparzystych liczb w zakresie [1,n+1] (więc n0n1 i n0+n1=n+1 ). Następnie jest b{0,1} takie, że na wejściu jest co najwyżej nb1 wartości z parzystością b . Rzeczywiście, w przeciwnym razie istnieje co najmniej n0parzyste i co najmniej n1 nieparzyste wartości na wejściu, co oznacza, że ​​jest co najmniej n0+n1=n+1 wartości na wejściu, sprzeczność (jest ich tylko n ). Oznacza to, że możemy kontynuować wyszukiwanie brakującej liczby tylko wśród liczb nieparzystych lub parzystych. Ten sam algorytm można również zastosować do wyższych bitów notacji binarnej.

Nasz algorytm będzie wyglądał następująco:

  1. Załóżmy, że już teraz, że są tylko x wartości na wejściu z resztkowej modulo 2b jest równe r[0,2b) ale co najmniej x+1 liczb w zakresie [1,n+1] , który ma reszta r modulo 2b (na początku wiemy, że na pewno dla b=0,r=0 ).

  2. Powiedzmy, że na wejściu jest x0 wartości z resztą r modulo 2b+1 i x1 na wejściu z resztą r+2b modulo 2b+1 (możemy znaleźć te liczby w jednym przejściu przez wejście). Oczywiście x0+x1=x . Ponadto, ponieważ na wejściu znajduje się co najmniej x+1 liczb z resztą ( r , b + 1 )r modulo2b , co najmniej jednego z pary(r,b+1),(r+2b,b+1) spełnia wymagania kroku1 .

  3. Znaleźliśmy brakującą liczbę, gdy 2bn+1 : jest tylko jedna liczba w zakresie [1,n+1] która może mieć resztę r modulo 2b ( samo r , jeśli jest w zakresie), więc są na większość wartości zerowych na wejściu, które mają taką resztę. Więc r jest rzeczywiście brakuje.

Oczywiście algorytm zatrzymuje się w krokach O(logn) , każdy z nich potrzebuje czasu O(n) (pojedyncze przejście przez tablicę wejściową). Ponadto wymagane są tylko słowa pamięci O(1) .

Kaban-5
źródło
Cieszę się, że po tym czasie odpowiedź została udzielona :)
sdcvvc,
1

Jeśli rozumiem twoje definicje, można to zrobić w czasie liniowym ze stałą przestrzenią. Jest to oczywiście najniższa granica, ponieważ musimy przynajmniej odczytać całe wejście.

Odpowiedź udzielona w tym pytaniu jest satysfakcjonująca.

Niemożliwe jest uruchomienie tego z mniejszym czasem lub przestrzenią, a dodanie dodatkowego czasu lub przestrzeni jest bezużyteczne, więc nie ma tutaj kompromisu między czasoprzestrzenią. (Zauważ, że , więc zaobserwowany przez ciebie kompromis nie jest asymptotyczny.)n=O(n/k)

Jeśli chodzi o twoje ogólne pytanie, nie znam żadnych fajnych twierdzeń, które pomogą ci udowodnić kompromisy czasoprzestrzenne. To pytanie wydaje się wskazywać, że nie ma (znanej) łatwej odpowiedzi. Gruntownie:

Przypuśćmy, że część języka jest rozstrzygalne w czasu (za pomocą pewnej ilości przestrzeni) i y przestrzeń (stosując pewną ilość czasu). Można znaleźć , f , g , tak że L jest rozstrzygalne przez M , która biegnie w f ( t , s ), czasu i g ( t , s )tsf,gLMf(t,s)g(t,s) ?

jest nieznany, a silna odpowiedź rozwiązałaby wiele otwartych problemów (w szczególności dotyczących SC), co sugeruje, że nie ma łatwego rozwiązania.


EDYCJA: Ok, z powtarzaniem (ale nadal zakładam, że przy wejściu o wielkości maksymalna możliwa liczba to n + 1nn+1 ).

Zauważ, że nasz algorytm musi być w stanie rozróżnić co najmniej możliwych odpowiedzi. Załóżmy, że przy każdym przejściu danych możemy uzyskać maksymalnie k części danych. Następnie będziemy potrzebować n / k przepustek, aby rozróżnić wszystkie odpowiedzi. Zakładając, że k = n / s, wówczas biegniemy w nnkn/kk=n/snn/sn=sn czas. Myślę więc, że to potwierdza, czego chcesz.

Trudność polega na wykazaniu, że za każdym razem otrzymujemy tylko bitów. Jeśli założysz, że naszą jedyną legalną operacją jest =, to jesteśmy dobrzy. Jeśli jednak zezwolisz na bardziej złożone operacje, będziesz w stanie uzyskać więcej informacji.k

Xodarap
źródło
3
Połączone pytanie zakłada, że ​​każdy numer pojawia się najwyżej raz. Nie przyjmuję tego założenia, więc rozwiązanie nie ma zastosowania. Dziękujemy za drugi link.
sdcvvc
@sdcvvc: Mój błąd, zakładam, że używasz wersji, którą znam. Nie mam pełnej odpowiedzi, ale komentarz jest za długi - mam nadzieję, że moja edycja przyda się.
Xodarap,
5
k 2kn/2kn/k