Algorytm czasu liniowego znajdowania przesuniętego maks

11

Załóżmy, że otrzymujemy tablicę A[1..n] zawierającą nieujemne liczby całkowite (niekoniecznie różne).

BA

m=maxi[n]B[i]+i.

Oczywistym rozwiązaniem jest sortowanie a następnie obliczanie . Daje to algorytm działający w czasie w najgorszym przypadku.AmO(nlgn)

Czy można to zrobić lepiej? Czy możemy obliczyć czasie liniowym?m


Moje główne pytanie to powyższe. Byłoby jednak interesujące wiedzieć o następującym uogólnieniu problemu.

Niech być sortowane według niektórych porównania oracle i w zależności od danego wyrocznię. Biorąc pod uwagę i wyrocznie dla i , co możemy powiedzieć o czasie potrzebnym do obliczenia ?BAfAfm=maxi[n]f(B[i],i)

Możemy obliczyć jeszcze w czasu. Ale czy możemy udowodnić superliniową granicę dolną dla tego uogólnionego przypadku?mO(nlgn)

Jeśli odpowiedź brzmi „tak”, czy dolna granica jest zachowana, jeśli założymy, że jest zwykłą kolejnością na liczbach całkowitych, a jest funkcją „ładną” (monotoniczną, wielomianową, liniową itp.)?f

Kaveh
źródło

Odpowiedzi:

10

Możemy obliczyć czasie liniowym.m

Dla uproszczenia załóżmy, że tablice są oparte na 0: , . Chcemy obliczyć .A[0..n1]B[0..n1]m=maxiB[i]+i

Niech . Oczywiście .max=maxiA[i]maxm

Niech będzie po sortowaniu. Jeśli mamy A[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

Dlatego możemy zignorować gdy . Musimy tylko wziąć pod uwagę liczby z zakresu .A[j]A[j]maxn[maxn,max]

Możemy użyć liczenia sortowania w celu posortowania numery , które należą do zakresu , w czasie liniowej i użyć do obliczenia posortowanej listy .A[maxn,max]m

Marzio De Biasi
źródło
... mmm ... ale jaki jest koszt C [x] = C [x] +1?!?
Marzio De Biasi,
1
czy jest problem z twoją odpowiedzią? ponieważ wydaje mi się to w porządku: mówisz, że dbamy tylko o elementy tablicy z wartościami w , więc możemy użyć sortowania zliczającego. Działa to dla ogólnego problemu, ilekroć dla wszystkich . | f ( B [ i ] , i ) - B [ i ] | = O ( n ) i[Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov
Dzięki @Marzio. :) Lekko zredagowałem twoją odpowiedź dla jasności. Zapraszam do wycofania mojej edycji lub dalszej edycji.
Kaveh,
1
To rozwiązanie wydaje się działać również dla dowolnego gdzie dla wszystkich i , . x i n | f ( x , i ) - x | = O ( n )f(x,i)xin|f(x,i)x|=O(n)
Kaveh,
@Kaveh: edycja jest w porządku! Szybko napisałem odpowiedź i nawet nie byłem pewien jej poprawności: -S
Marzio De Biasi,
-1

Jeśli tablica składa się z różnych liczb całkowitych, to , ponieważ odległość między sąsiednimi wpisami w wynosi co najmniej ; sytuacja jest bardziej interesująca, gdy nie muszą być wyraźne.Am=max(A)+1B1

W przypadku bardziej ogólnego pytania wyobraź sobie sytuację, w której jest „interesujące” tylko wtedy, gdy . Wydaje się, że możliwe jest skonstruowanie argumentu przeciwnika, który zmusza cię do zapytania dla wszystkich zanim będziesz mógł poznać , dlatego musisz posortować , aby znajdź odpowiedź, która bierze porównania . (Istnieją pewne komplikacje, ponieważ może się zdarzyć, że możemy przetestować, czy w stałym, a nie liniowym czasie, poprzez zapytanie .) Tak jest, nawet jeśli jest wielomianem (wysokiego stopnia).f(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f

Yuval Filmus
źródło
1
Co jeśli A ma n - 1 zer i jeden? Zatem odpowiedź brzmi n, nie 1.
Grigorij Jarosławtsev
Cześć Yuval. Nie można powtarzać numery . Jak powiedział Grigory, rozwiązanie wydaje się nie działać. A
Kaveh
Myślę, że widzę twój pomysł na dolną granicę argumentu: biorąc pod uwagę , możemy szybko obliczyć używając par zapytań utworzonych dla przez algorytm rozwiązujący problem w czasie . Możemy upewnić się, że algorytm wysyła zapytania do wszystkich ale nie możemy upewnić się, że nie wyszukuje zapytań dla innych par. Możemy jednak ustawić wartość dla innych par, aby były wyróżnialną wartością, abyśmy mogli odrzucić te pary. B f o ( n lg n ) f ( B [ i ] , i ) fABfo(nlgn)f(B[i],i)f
Kaveh