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:
- Wybierz liczbę losową, aby przypisać do nowo dodanego elementu.
- Włóż element do BST, używając standardowego wstawiania BST.
- 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!
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
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
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