Binarnej sekwencji o długości właśnie uporządkowaną sekwencję , tak że każdy oznacza albo lub . Aby wygenerować wszystkie takie sekwencje binarne, można użyć oczywistej struktury drzewa binarnego w następujący sposób: katalog główny jest „pusty”, ale każde lewe dziecko odpowiada dodaniu do istniejącego łańcucha, a każde prawe dziecko . Teraz każda sekwencja binarna jest po prostu ścieżką o długości rozpoczynającą się od nasady i kończącą się na liściu.
Oto moje pytanie:
Możemy zrobić lepiej, jeśli chcemy tylko, aby wygenerować wszystkie binarne ciągi o długości , które mają dokładnie zer i te?
Przez „czy możemy zrobić lepiej”, mam na myśli, że powinniśmy mieć mniejszą złożoność niż głupiutki algorytm, który najpierw buduje całe drzewo powyżej, a następnie próbuje znaleźć ścieżki o równej liczbie „lewej” i „prawej” krawędzi.
źródło
Odpowiedzi:
Oczywiście istnieją ciągów binarnych o długości 2 n . Aby przejść przez plik binarny, algorytm musi odwiedzić każdy węzeł raz, tzn. Musi wykonać 2 n ∑ i = 0 2 i = 2 24n 2n
.
Rozważmy algorytm rekurencyjny, który przemierza drzewo, które opisałeś, ale zlicza jedynki i zera na swojej drodze, tzn. Będzie on przechodził tylko przez dobrą część drzewa.n n n i używamy wzoru Stirlinga w kroku 2:
( 2 n2n
Ale ile jest takich ciągów binarnych z i zerami ? Wybieramy n 1 dla naszych łańcuchów długości
EDYCJA
Dzięki komentarzom Petera Shora możemy również przeanalizować liczbę kroków wymaganych przez drugi algorytm, który zlicza jedynki i zera. Cytuję jego komentarz od dołu:
Korzystając ponownie ze wzoru Stirlinga, otrzymujemy jako czas działania nowego algorytmu.
źródło
Być może jestem gruby, ale pierwotne pytanie dotyczyło sposobu wygenerowania wszystkich „zbalansowanych” sekwencji binarnych o długości 2n, który byłby bardziej wydajny niż przemierzanie drzewa wszystkich sekwencji binarnych o długości 2n i generowanie tylko tych, które były zrównoważone. Po co więc w ogóle korzystać z drzewa?
Oto pseudokod algorytmu rekurencyjnego, który generuje wszystkie takie sekwencje (słowo kluczowe „wydajność” wysyła sekwencję na wyjście):
Jeśli coś nie rozumiem, powiedz mi, ale wydaje mi się, że chodzi o najbardziej skuteczną odpowiedź na postawiony problem, który nigdy nie określał użycia drzewa.
źródło