2011-08-29 14 views
10

Właśnie ukończyłem rozmowę o pracę i zmagałem się z tym pytaniem, co wydaje mi się bardzo trudnym pytaniem o udzielenie 15-minutowej rozmowy.Utwórz zbalansowane drzewo wyszukiwania binarnego ze strumienia liczb całkowitych

Pytanie brzmiało: Napisz funkcję, która podając strumień liczb całkowitych (nieuporządkowane), buduje zrównoważone drzewo wyszukiwania. Teraz nie możesz się doczekać zakończenia wejścia (jest to strumień), więc musisz zrównoważyć drzewo w locie.

Moja pierwsza odpowiedź polegała na użyciu czerwono-czarnego drzewa, które oczywiście spełnia swoją funkcję, ale muszę założyć, że nie spodziewają się, że zaimplementuję czerwone, czarne drzewo w 15 minut.

Czy istnieje jakieś proste rozwiązanie tego problemu, którego nie znam?

Dzięki,

Dave

+0

Czy wiesz coś o liczbach całkowitych (innych niż fakt, że są nieposortowane)? Czy możesz zbudować BST w odpowiedzi na kogoś, kto szuka elementu, czy też musisz mieć BST dostępny przez cały czas? Czy możesz zbudować wiele różnych BSTów, czy też musisz zbudować tylko jeden? – templatetypedef

+0

Cóż, może mógłbyś użyć czerwonego czarnego drzewa pod dość liberalną interpretacją reguł. Od 15 minut to nie jest dużo czasu, jeśli możesz zrobić coś głupiego, jak używać kontenerów STL i algorytmów, możesz po prostu stworzyć std :: map, a następnie wstawić obiekty bezpośrednio do tego (ale muszę przyznać, że to jest w zasadzie oszukiwanie). – Mikola

+0

Pytanie wyglądało tak, jak się wydaje, nie ma żadnych innych założeń dotyczących danych wejściowych lub użycia. Pomyślałem, że może istnieje wspólny algorytm i po prostu nie jestem tego świadomy. Najwyraźniej chcieli, abym zaimplementował zrównoważone drzewo, jakie znam. Powodzenia z tym. – Dave

Odpowiedz

3

AA Trees są nieco prostsze niż czerwono-czarny drzew, ale nie mogłem realizować jeden w mojej głowie.

+0

Myślę, że to najlepsza odpowiedź. Jeśli masz zamiar zatwierdzić zbalansowany algorytm drzewa do pamięci, jest to jeden z najprostszych. Jest to podwójnie dobra odpowiedź, ponieważ usunięcie dla drzewa AA jest najbardziej skomplikowane do wdrożenia i wydaje się, że pytanie nie wymaga funkcji usuwania. –

9

Osobiście uważam, że najlepszym sposobem na zrobienie tego byłoby wybranie losowego drzewa binarnego wyszukiwania, takiego jak treap. Nie gwarantuje to absolutnie, że drzewo będzie zrównoważone, ale z dużym prawdopodobieństwem drzewo będzie miało dobry współczynnik równowagi. Rozgałęzienie działa poprzez zwiększenie każdego elementu drzewa o równomiernie losową liczbę, a następnie zapewnienie, że drzewo jest drzewem binarnym wyszukiwania w odniesieniu do kluczy i stosu w odniesieniu do jednolitych losowych wartości. Wstawianie do ścieżki jest niezwykle proste:

  1. Wybierz liczbę losową, aby przypisać do nowo dodanego elementu.
  2. Włóż element do BST, używając standardowego wstawiania BST.
  3. Gdy klucz nowo wstawionego elementu jest większy niż klucz jego elementu nadrzędnego, wykonaj obrót drzewa, aby nowy element znalazł się nad elementem nadrzędnym.

Ten ostatni krok jest jedyny naprawdę trudny, ale jeśli miałeś czas na opracowanie go na tablicy, to jestem pewien, że mógłbyś to zaimplementować w trakcie rozmowy kwalifikacyjnej.

Inną opcją, która może działać, jest użycie splay tree. Jest to kolejny typ szybkiego BST, który można zaimplementować, zakładając, że masz standardową funkcję wstawiania BST i możliwość obracania drzewem. Co ważne, w rzeczywistości drzewa o wielkości skokowej są w praktyce bardzo szybkie, co oznacza, że ​​są one (tak jak w przypadku współczynnika stałego) co najmniej tak dobre, jak każde inne statyczne drzewo wyszukiwania binarnego.

W zależności od tego, co rozumie się przez "drzewo wyszukiwania", można również rozważyć przechowywanie liczb całkowitych w niektórych strukturach zoptymalizowanych do wyszukiwania liczb całkowitych. Na przykład można użyć wartości bitwise trie do przechowywania liczb całkowitych, która obsługuje wyszukiwanie w czasie proporcjonalnym do liczby bitów słowa maszynowego. Można to całkiem dobrze zaimplementować za pomocą funkcji rekursywnej, aby przejrzeć bity i nie wymaga żadnego obrotu. Jeśli chcesz zarzucić wykonanie w piętnaście minut i jeśli osoba przeprowadzająca wywiad pozwoli ci odejść od standardowych drzewek wyszukiwania binarnego, może to być świetne rozwiązanie.

Mam nadzieję, że to pomoże!

+0

Po pierwsze, to pomaga :) Ale nadal uważam, że jest to duże pytanie w wywiadzie. Wygląda na to, że treap to dobre rozwiązanie, ale nie sądzę, żeby tak właśnie miał na myśli rozmówca. Jest to naprawdę nietrywialne rozwiązanie problemu BST, a jeśli nie znasz go przed wywiadem (jak ja), to nie jest to realistyczna opcja. jeśli chodzi o drzewo gry, to jest dokładnie tak, jak wspomina się o drzewie czerwono-czarnym (chociaż jest łatwiejsze do wdrożenia). Ale wdrożenie go nadal nie jest trywialne, a na krótki wywiad wydaje się dużym pytaniem. – Dave

+0

Dodałbym drzewka do gry, choć nie są one technicznie "zrównoważone", mogą być wystarczająco dobre dla tego, o co pytał wywiad (na przykład, sprawdź element kth lub coś podobnego). – Mikola

+0

Nie sądzę, że jest możliwe napisanie treapy lub drzewa gry w przeciągu 15 minut. bitowe trie jest dobre, ale nie wiadomo, czy ankieter zgadza się: P. –

1

Jednym z najprostszych zrównoważonych drzew poszukiwań binarnych jest BB (α). Wybierasz stałą α, która mówi, ile niezrównoważonego może uzyskać drzewo. Przez cały czas musi się znajdować #descendants(child) <= (1-α) × #descendants(node). Traktujesz to jak zwykłe drzewo wyszukiwania binarnego, ale gdy formuła nie dotyczy już jakiegoś węzła, po prostu odbudujesz tę część drzewa od początku, dzięki czemu jest idealnie zrównoważona.

Amortyzowana złożoność czasu do wstawienia lub usunięcia nadal jest O (log N), tak jak w przypadku innych zrównoważonych drzew binarnych.

Powiązane problemy