Uma sequência binária de comprimento é apenas uma sequência ordenada para que cada seja ou . Para gerar todas essas seqüências binárias, pode-se usar a estrutura óbvia da árvore binária da seguinte maneira: a raiz está "vazia", mas cada filho esquerdo corresponde à adição de à cadeia existente e cada filho direito a um . Agora, cada sequência binária é simplesmente um caminho de comprimento começando na raiz e terminando em uma folha.x 1 , … , x n x j 0 1 0 1 n + 1
Aqui está a minha pergunta:
Podemos fazer melhor se quisermos gerar apenas todas as seqüências binárias de comprimento que possuem exatamente zeros e ?n n
Por "podemos melhorar", quero dizer que devemos ter uma complexidade menor do que o algoritmo tolo que primeiro constrói a árvore inteira acima e depois tenta encontrar esses caminhos com um número igual de bordas "esquerda" e "direita".
fonte
Respostas:
Obviamente, existem cadeias binárias de comprimento . Para percorrer o binário, um algoritmo precisa visitar cada nó uma vez, ou seja, etapas.4n 2n
Vamos considerar um algoritmo recursivo que atravessa a árvore que você descreveu, mas conta o número de uns e zeros no caminho, ou seja, ele percorre apenas a parte boa da árvore.n n n 2n
Mas quantas cadeias binárias com 0 e 1 existem? Escolhemos 1s para nossas seqüências de comprimento e usamos a fórmula de Stirling na etapa 2:
EDIT
Graças aos comentários de Peter Shor, também podemos analisar o número de etapas necessárias pelo segundo algoritmo, que conta os 1 e os 0. Estou citando seu comentário abaixo:
Usando a fórmula de Stirling novamente, obtemos como o tempo de execução do novo algoritmo.
fonte
Talvez eu esteja sendo grossa, mas a pergunta original pediu uma maneira de gerar todas as seqüências binárias "equilibradas" de comprimento 2n que fossem mais eficientes do que atravessar uma árvore de todas as sequências binárias de comprimento 2n e produzir apenas aquelas que estavam equilibradas. Então, por que usar uma árvore?
Aqui está o pseudocódigo para um algoritmo recursivo que gera todas essas seqüências (a palavra-chave "yield" envia uma sequência para a saída):
Se estou entendendo algo errado, diga-me, mas me parece que essa é a resposta mais eficiente para o problema realmente colocado, que nunca especificou o uso de uma árvore.
fonte