Jak znaleźć indeks elementu w posortowanej secie?

głosy
4

Mogę znaleźć element w uporządkowany zestaw (poparte BST) w O(logN). Teraz chciałbym indeks tego elementu. Na przykład w zestawie {1, 3, 4, 10}, indeks 4Is 2a indeks 1jest 0.

Oczywiście, mogę po prostu iteracyjne nad zestawem, więc rozwiązanie jest trywialne O(N). Możemy to zrobić lepiej przy użyciu prawdopodobnie BST właściwości i / lub pomocniczych struktur danych?

Utwórz 09/05/2011 o 11:46
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
3

Z prostym BST gdzie kolejność wkładania elementów losowych, masz sposób, aby określić, ile dokładnie elementy są mniejsze niż danego elementu bez chodzenia drzewa.

Jeśli miał wyważone drzewo, taki jak drzewo czerwono-czarne, a następnie można umieścić przynajmniej dolną i górną granicę wskaźnika ze względu na granice na wysokości drzewa. Jeśli kolejność wstawiania elementów do BST jest nieprzypadkowe potem znowu, można powiedzieć coś o wysokości drzew bez chodzenia go i dać pewną szacunkową wartość wskaźnika przybliżonej.

Co do dodatkowych struktur danych, można utworzyć dodatkowego słownika, który mapuje elementy do swojego indeksu. Jednak budowa tego indeksu zajmuje O (N), a indeks jest nieaktualny podczas dodawania nowych elementów do BST, więc to tylko działa dobrze dla BSTS z rzadkich aktualizacji.

Innym rozwiązaniem jest rozszerzenie węzły BST dwie właściwości: wskaźnik i liczy. Indeks mówi ilu elementy mniejsze niż w tym węźle są w drzewie. Hrabia mówi, jak wiele elementów były w BST podczas ostatniej aktualizacji indeksu węzła. Ze stosunkowo prostych zmian do wstawiania, usuwania i wyszukiwania na BST, które nie mają wpływu na te podstawowe operacje poza stałym czasie i można dostać indeks elementu bezpośrednio w czasie O (1).

Zasadniczo, jak wstawić nowy węzeł, dla każdego węzła można przejść na swojej drodze w dół, gdy nowy element jest mniejszy (tj następnym krokiem jest po lewej dziecka), przyrost zarówno wskaźnik i liczyć tego węzła. Kiedy znajdziesz się nowy element jest, dajesz mu liczyć na podstawie jego rodziców i indeks na podstawie jego rodziców i lewym dziecka. Pozostawia to elementy większe niż nowy z niewłaściwym indeksie, ale można łatwo aktualizować, że jak szukać elementu, odwołując się do wartości liczby rodzica - różnicę między liczbą rodzica i dziecka mówi, jak wstawki z wielu mniejszych elementów wydarzyło od ostatniej aktualizacji indeksu dziecka, więc po prostu dodać tę różnicę do indeksu.

Odpowiedział 09/05/2011 o 13:13
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more