Oto dobrze znany problem.
Biorąc pod uwagę tablicę dodatnich liczb całkowitych, wyprowadzaj najmniejszą dodatnią liczbę całkowitą spoza tablicy.
Problem można rozwiązać w przestrzeni i czasie : przeczytaj tablicę, śledź w przestrzeni czy wystąpiło poszukaj najmniejszego elementu.
Zauważyłem, że możesz wymieniać przestrzeń na czas. Jeśli masz tylko pamięć, możesz to zrobić wrundach i uzyskać czas. W szczególnym przypadku istnieje oczywiście algorytm kwadratowy o stałej przestrzeni.
Moje pytanie brzmi:
Czy jest to optymalny kompromis, tj. Czy ? 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 ).
Odpowiedzi:
Można to zrobić za pomocą operacji na słowachO(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 jestn0 parzystych i n1 nieparzystych liczb w zakresie [1,n+1] (więc n0≈n1 i n0+n1=n+1 ). Następnie jest b∈{0,1} takie, że na wejściu jest co najwyżej nb−1 wartości z parzystością b . Rzeczywiście, w przeciwnym razie istnieje co najmniej n0 parzyste 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:
Załóżmy, że już teraz, że są tylkox 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 ).
Powiedzmy, że na wejściu jestx0 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 .
Znaleźliśmy brakującą liczbę, gdy2b⩾n+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 krokachO(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) .
źródło
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:
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 + 1n n+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 nn k n/k k=n/s nn/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
źródło