2016-07-12 13 views
11

Biorąc tablicę, dla każdego elementu muszę znaleźć najmniejszy element po prawej stronie danego elementu, który jest większy od bieżącego elementu.Znajdź następny większy element w tablicy

Matematycznie Dla każdego wskaźnika i w tablicy A, trzeba znaleźć wskaźnik j tak, że

A[j] > A[i] 
j > i 
A[j] - A[i] is minimum 

trzeba znaleźć j dla każdego indeksu i

Bestia roztwór siła byłaby O(n^2) i mam nadzieję, że zrobię to lepiej. Myślę, że rozwiązanie O(n log n) jest możliwe dzięki samonośrodkowemu BST, ale wydaje się to dość skomplikowane. Ponadto potrzebuję rozwiązania O(n).

Czy istnieje rozwiązanie tego problemu w postaci O(n)? Czy istnieje dowód, że dolna granica to O(n log n)?

+0

Musisz znaleźć dla każdego indeksu? A może tylko dany indeks? –

+0

Tak więc wejście to "A" i "i", pożądane wyjście to 'j', s.t. podane warunki są spełnione? – Nicolas

+1

Potrzebuję go dla wszystkich indeksów. Nie tylko jednego. Dane wejściowe to '' A'' a wyjście to tablica '' B'' zawierająca '' j'' dla wszystkich indeksów '' i'' –

Odpowiedz

9

Dowód O (nlogn) dolnej granicy (na podstawie algorytmów porównywania)

Umożliwia że mamy algorytm porównywania oparte że wykonania tego zadania w O (n). To jest dla każdego indeksu, mamy bezpośrednio większy element po jego prawej stronie (powiedzmy R [i]).

Analogicznie możemy uruchomić ten algorytm na odwróconej macierzy wejściowej, a następnie odwrócić wynik. Dla każdego indeksu mamy bezpośrednio większy element po jego lewej stronie (powiedzmy L [i]).

Oznacza to, że w O (n) mamy dla każdego elementu bezpośredni bezpośredni większy element tablicy = min (R [i], L [i]).

Możemy teraz posortować tablicę, korzystając z tych informacji.

Znajdź minimalny element w tablicy. Znajdź jego następcę (natychmiast większy element), następcę następcy itd. Stąd masz całą tablicę w posortowanej kolejności.

Uporządkował tablicę w O (n), używając tylko porównań (sprzeczność).

O (nlogn) Algorytm:
rozpocząć budowę zrównoważony BST z prawej strony tablicy. Węzły będą zawierać wartości i odpowiednie indeksy.

Następnie dla każdego napotkanego nowego elementu wstawienie go do BST otrzyma odpowiedni najbliższy większy indeks/wartość.

+0

Nie możemy całkowicie posortować według dokładnie tego, jak opisałeś. Mamy po prostu większy element po jego prawej stronie, a nie ogólnie. Czy możesz wyjaśnić? –

+1

@AkashdeepSaluja Natychmiast znajdujemy większy element po prawej stronie (na przykład R [i]). Podobnie możemy znaleźć natychmiast większy większy element po lewej stronie (powiedzmy L [i]), uruchamiając ten algorytm w odwrotnej kolejności. Oznacza to, że mają natychmiast większy większy element = min (R [i], L [i]). –

+0

Można również uzyskać algorytm 'O (n log n)', tworząc typ zawierający wartość i indeks w oryginalnej tablicy i sortując je dla wartości. – Codor

Powiązane problemy