Une séquence binaire de longueur est juste une séquence ordonnée sorte que chaque soit ou . Afin de générer toutes ces séquences binaires, on peut utiliser la structure d'arbre binaire évidente de la manière suivante: la racine est "vide", mais chaque enfant gauche correspond à l'ajout de à la chaîne existante et chaque enfant droit à un . Maintenant, chaque séquence binaire est simplement un chemin de longueur commençant à la racine et se terminant à une feuille.x j 0 1 0 1 n + 1
Voici ma question:
Pouvons-nous faire mieux si nous voulons seulement générer toutes les chaînes binaires de longueur qui ont précisément zéros et uns?n n
Par "pouvons-nous faire mieux", je veux dire que nous devrions avoir une complexité inférieure à l'algorithme stupide qui construit d'abord l'arbre entier ci-dessus et essaie ensuite de trouver ces chemins avec un nombre égal d'arêtes "gauche" et "droite".
la source
Réponses:
Evidemment, il y a chaînes binaires de longueur . Pour parcourir le binaire, un algorithme doit visiter chaque nœud une fois, c'est-à-dire qu'il doit faire étapes. 2 n 2 n ∑ i = 0 2 i = 2 2 n + 1 - 1 = O ( 4 n )4n 2 n
Prenons un algorithme récursif qui traverse l'arbre que vous avez décrit, mais compte le nombre de uns et de zéros sur son chemin, c'est-à-dire qu'il ne traversera que la bonne partie de l'arbre.n n n 2 n
Mais combien de ces chaînes binaires avec 0 et 1 existe-t-il? Nous choisissons 1 pour nos chaînes de longueur et utilisons la formule de Stirling à l'étape 2: n n 2 n ( 2 n
EDIT
Grâce aux commentaires de Peter Shor, nous pouvons également analyser le nombre d'étapes nécessaires au deuxième algorithme, qui compte les 1 et les 0. Je cite son commentaire ci-dessous:
En utilisant à nouveau la formule de Stirling, nous obtenons comme durée d'exécution du nouvel algorithme.
la source
Peut-être que je suis épaisse, mais la question d'origine demandait un moyen de générer toutes les séquences binaires "équilibrées" de longueur 2n qui était plus efficace que de parcourir un arbre de toutes les séquences binaires de longueur 2n et de ne produire que celles qui étaient équilibrées. Alors pourquoi utiliser un arbre?
Voici le pseudocode d'un algorithme récursif qui génère toutes ces séquences (le mot-clé "yield" envoie une séquence à la sortie):
Si je me méprends sur quelque chose, dites-le moi, mais il me semble qu'il s'agit de la réponse la plus efficace au problème réellement posé, qui n'a jamais précisé l'utilisation d'un arbre.
la source