Skuteczne wyszukiwanie liczby mniejszych elementów dla każdego elementu w tablicy

9

Utknąłem na tym problemie:

Biorąc pod uwagę tablicę ZA z pierwszego n liczby naturalne losowo permutowane, tablica b jest zbudowany tak, że b(k) jest liczbą elementów od ZA(1) do ZA(k-1) które są mniejsze niż ZA(k).

i) Biorąc pod uwagę ZA czy możesz znaleźć b w O(n)czas?
ii) Biorąc pod uwagęb czy możesz znaleźć ZA w O(n) czas?

Tutaj, b(1)=0. Konkretny przykład:

|ZA843)172)965b00003)1644|

Czy ktoś może mi pomóc? Dzięki.

cholernie
źródło
Znalazłem to: obliczanie kodowania permutacji, które dajeO(nlogn)algorytmy dla tych problemów. Przynajmniej myślę, że to te same problemy.
Realz Slaw
@Merbs, czy podana przez Ciebie wskazówka oznacza, że ​​masz rozwiązanie?
AJed
1
@AJed, oznacza to, że mam algorytm, choć trzeba O(n2)) dla prostego algorytmu bez spacji i O(nlogn)jeśli pozwolą nam miejsce. W tej chwili pochylam się, aby żadna z nich nie była możliwaO(n)i oba są tym samym algorytmem.
Merbs
@Merbs. Myślę, że twoja wskazówka może prowadzić do właściwej ścieżki. Mam też jedno rozwiązanie (zgodnie ze wskazówkami). Wydaje mi się, że w analizie jest pewna sztuczkaO(n).. Myślę, że sztuczką jest wiedza, że ZA wychodzi z 1:ntylko.
AJed
2
Ten dokument daje również O(nlogn)algorytm. Czy jesteś pewien, że istniejeO(n)algorytm do tego?
Realz Slaw

Odpowiedzi:

1

Naiwny algorytm ustalania b od A:

Dla k=1,,n, określ wartość B(k) przez porównanie każdego z nich A(i) do A(k) dla i=1,,k i licząc tych, którzy spełniają A(i)<A(k).

Ten algorytm się porównuje A(1) dla wszystkich innych (n1 czasy), A(2) do n-2) inne itp., więc łączna liczba porównań wynosi (n-1)(n-2))2). Ale to nie najlepsze, co możemy zrobić. Na przykład patrzącb(n), nie musimy dokonywać żadnych porównań! b(n)=ZA(n)-1ponieważ to pierwszy n liczby naturalne i jest gwarantowane (niezależnie od permutacji), że n-1będą tam niższe liczby naturalne. Co powiesz nab(n-1)? Zamiast sprawdzaćZA(1) przez ZA(n-2)), moglibyśmy po prostu sprawdzić ZA(n). To jest:

Dla k=1,,n2), użyj powyższego algorytmu; dla k=n2),,n użyj algorytmu odwrotnego: ustal b(k) ustawiając go początkowo na ZA(n)-1 a następnie odejmowanie 1 dla każdego wpisu ZA(ja) dla ja=k+1,,n to mniej niż ZA(k).

To zajmie 2)×(n2)-1)(n2)-2))2)=(n-2))(n-4)4 kroki, które są nadal O(n2)). Zauważ też, że przy konstruowaniuZA od b, gdyby b(n)=ZA(n)-1 następnie ZA(n)=b(n)+1.

Ale teraz więcej finezji. Jeśli otrzymamy dodatkowe miejsce lub sortujemy w miejscu, możemy sortować liczby, porównując je. Na przykład:

|ZA843)172)965S.98743)2)165b00003)16|

Zamiast sprawdzać je wszystkie (lub sprawdzać je w kolejności), możemy użyć wyszukiwania binarnego, aby ustalić każde z nich b(k). Jednak sortowanie wciąż wymaga czasuO(nlogn).

Merbs
źródło
To był tylko mój pierwszy pomysł; choć zdaję sobie sprawę, że problem jest bardziej interesujący, niż początkowo go przypisywałem. I nie miałem jeszcze okazji przeczytać ustaleń Realza Slawa, więc algorytm może być wyłączony.
Merbs
0

Zamiast ustalania każdego z nich b(k) pojedynczo, możemy patrzeć w przyszłość i przeglądać tylko każdy numer ZA raz ! Ale użyjemyn przestrzeń:

|ZA12)3)456789b800000000104000011112)03)00012)2)2)2)3)010112)3)3)3)3)4070112)3)3)3)453)2)012)3)4445619012)3)4445666012)3)4456745012)3)456784|

Możemy zaoszczędzić jeszcze więcej czasu, nie aktualizując tych, które zostały już określone (to znaczy, nie ma sensu aktualizować 8 po pierwszym kroku), ale w najgorszym przypadku nadal musimy dokonać aktualizacji (n)(n+2))2) czasy

Merbs
źródło
0

zarówno I, jak i II można rozwiązać za pomocą #next_greater_element, który tu wyjaśniłem . ale jest to trochę trudniejsze niż sam problem, ale przed rozwiązaniem musisz nauczyć się kolejnego większego elementu:

  1. rozważmy, że mamy wektor dla każdego elementu ZA Nazwij to S.ja dla elementu ja. teraz uruchom kolejny większy algorytm, zaczynając od prawej do lewej, ale z wyjątkiem elementu ustawiającegoja w ZA jego następny większy indeks elementów, wciśnij S.ja elementy, które ja jest ich kolejnym większym elementem. następnie iteruj po tablicy od lewej do prawej, a następnie b[ja]=jot=0x(S.ja[jot]+1) gdzie x to rozmiar wektora S.ja.i jej Θ(n) ponieważ każdy kolejny większy algorytm jest Θ(n) a także iteracja Θ(n)

druga część jest również podobna, zauważając, że możemy uzyskać wartość najbardziej odpowiedniego elementu O(1) EDYCJA: moje rozwiązanie jest złe, wydaje się, że nie ma żadnegoo(n) rozwiązanie

Ali.Mollahoseini
źródło