Limite superior da fib (n + 2)


8

Eu tenho um problema de lição de casa que está me deixando perplexo porque a matemática está além do que eu fiz, embora nos tenham dito que não era necessário resolver isso matematicamente. Basta fornecer um limite superior próximo e justificá-lo.

Deixei

f(n)=|{w{a,b}n:aaw}|.
Forneça um limite superior assintótico no f Como n.

Tão longe:

nstringscompared to 2n122n0232n1352n3482n85132n186212n43

A matemática que me dará um limite exato está além de mim. ObviamenteO(2n) é um limite superior, embora não seja particularmente apertado.

Alguma sugestão sobre o que devo tentar?


1
Bem-vindo à Ciência da Computação! O título que você escolheu não é adequado para representar sua pergunta. Por favor, dedique algum tempo para melhorá-lo; Reunimos alguns conselhos aqui . Obrigado!
Raphael

Muitas pessoas considerariam fib (n + 1) como uma expressão perfeitamente correta para um limite superior. Ainda melhor, pois é exata :-)
gnasher729

Respostas:


8

Portanto, não tenho certeza absoluta, mas acho que você está pedindo para contar o número de cadeias de tamanho n (sobre o alfabeto {a,b}) onde o fator / substring aa não parece certo?

Nesse caso, existem algumas abordagens combinatórias que você pode adotar. Tanto o Yuval quanto o ADG apresentaram argumentos mais simples e intuitivos, então eu definitivamente sugiro que verifique suas respostas! Aqui está um dos meus favoritos: é um pouco estranho, mas é uma abordagem muito geral (e meio divertida).

Vamos começar com um idioma mais simples, o das palavras que começa e termina com b (também sem substrings de aa) Podemos olhar para uma string admissível (por exemplo,bbbababbbb) como uma lista de sequências de bs separados por singular as. Isso fornece a construção:

w=(b+a)b+
Agora, como contamos frases que pertencem a esse idioma?

Vamos imaginar que estamos expandindo essas expressões. O queedenotar? Bem, é simplesmente

e=ϵeeeeeeeeee
Agora, isso fará muito pouco sentido, mas vamos imaginar que eé uma variável sobre algum campo numérico. Em particular, trataremosϵ1, aba+be abca×b×c. Isso então diz que
e1+e+ee+eee+
Vamos tentar ver a motivação por trás dessa estranha interpretação. Isso é quase uma transformação bijetiva. Em particular, queremos preservar a contagem de cadaenpalavra que, como você pode ver facilmente, nós fazemos. No entanto, há uma diferença crucial entre as expressões de string e expressões numéricas: a multiplicação (concatenação em strings,×em expressões numéricas) agora é comutativo! Intuitivamente, a comutatividade permite tratar todas as permutações da mesma palavra que a mesma; isto é, não desambiguamos entre a expressãobbbab e bbabb; ambos representam uma string com 4bse um a. Portanto, essa transformação nos permite preservar a contagem de cada palavra de um determinado número deaareia bs, mas agora nos permite fechar os olhos aos detalhes supérfluos com os quais não nos importamos.

Se você voltar ao pré-cálculo, poderá reconhecer esta série como 11e. Sei que não faz sentido reescrever essa expressão regular como uma função com valor numérico, mas apenas ficar nua comigo por um momento.

Similarmente, e+=eee1e. O que significa que podemos traduzirw para dentro

w11(b1b×a)×b1b

Por sua vez, podemos simplificar isso até

w(a,b)=b×11(b+ba)

Isso nos diz que o idioma w é isomórfico para o idioma b(bab) (cuja tradução direta já está b1bba) sem precisar recorrer a ferramentas teóricas da linguagem! Esse é um dos poderes de tratar essas séries como funções de forma fechada: podemos realizar simplificações nelas que são quase impossíveis de executar de outra maneira, reduzindo-as a um problema mais simples.

Agora, se você ainda se lembra de algum curso de cálculo, se lembra de que certos tipos de funções (sendo suficientemente comportadas) admitem essas representações em série conhecidas como expansões de Taylor. Não se preocupe, não teremos que nos preocupar com esses conjuntos de problemas irritantes do Calc 1; Estou apenas apontando que essas funções podem ser representadas como a soma

W(uma,b)=Eu,jWEujumaEubj
de modo a WEuj fornece o número de palavras que satisfazem W de tal forma que tem exatamente i ocorrências de a e j ocorrências de b. No entanto, não nos preocupamos particularmente se algo é uma ou um b. Em vez disso, apenas nos preocupamos com o número total de caracteres na sequência. Para fechar um "olho cego" entrea e b, podemos (literalmente) tratá-los da mesma forma, por exemplo, deixe z=a=b e pegue
w(z)=w(z,z)=z1zz2=kwkzk

Onde wk conta o número de palavras satisfatórias de comprimento k.

Agora, tudo o que resta a fazer é encontrar wk. The usual combinatorial approach here would be to decompose this rational function into its partial-fraction: that is, given the denominator 1zz2=(zϕ)(zψ), we can rewrite z(zϕ)(zψ)=Azϕ+Bzψ (There's a bit of algebra involved here, but this is a universal property of rational (one polynomial dividing another) functions). To solve this, you can refactor

Azϕ+Bzψ=z(zϕ)(zψ)
which generates the constraints A+B=1,Aψ+Bϕ=0. Irregardless of what A and B are, recall that 11x=1+x+x2+, well, we can rearrange
w(z)=Aϕz+Bψz=(Aϕ)11zϕ+(Bψ)11zψ=(Aϕ)(1+ϕ1z+ϕ2z2+)+(Bψ)(1+ψ1z+ψ2z2+)
therefore
wk=(Aϕ)ϕk+(Bψ)ψk
Here, ϕ is the golden ratio 1+52 and ψ=ϕ1 is its conjugate. We then have an easy description of the asymptotic behavior of the w language: it runs in Θ(ϕn). In fact, if you expand everything out, you'll find that
wk=ϕkψk5=ϕk5
There's also an intricate connection to another common combinatorial class. This is just the Fibonacci numbers!

Now, suppose you have wk, which counts the number of strings of size k that starts and ends with k (and also contains no aa substrings), how can we build a string that can start or end with an a? Well, it's simple: an admissible string is either in w (starts and ends with b), or it is aw (starts with a), or it is wa (ends with a), or it is awa (starts and ends with a). Therefore:

f(n)=wn+wn2+2wn1
Recall that wn is the fibonacci sequence, so wn1+wn2=wn, which means that
f(n)=(wn+wn1)+(wn2+wn1)=wn+1+wn=wn+2
Therefore, f(n)=fib(n+2)=ϕn+25

Now you probably don't have to do this analysis, but just by having the insight that this sequence is a shifted Fibonacci sequence ought to give you an idea of some other combinatorial interpretations that you can try.


7

Lee Gao's answer is excellent. Here is a different account. Consider the following automaton:

Automaton for the language

This is an unambiguous finite automaton (UFA) without ϵ transitions: an NFA such that each word has exactly one accepting path. The number of words of length n is thus the number of paths of length n from the starting state to an accepting state (since there are no ϵ transitions).

We can count the number of paths in a graph using linear algebra. Let M be the transition matrix of the automaton: M(qi,qj) is the number of arrows from qj to qi (each arrow is associated with a single symbol). Then

M2(qi,qj)=kM(qi,qk)M(qk,qj),
which is exactly the number of paths of length 2 from qj to qi. Similarly, Mn(qi,qj) is the number of paths of length n from qj to qi. In our case, we want to count the number of paths of length n from q0 to {q0,q1}, and so
f(n)=(11)(1110)n(10).
The standard way to calculate such an expression is by diagonalizing M (or, more generally, by computing the Jordan form of M). The eigenvalues of M are easily calculated to be 1±52, and so for some matrix P,
f(n)=(11)P((1+52)n00(152)n)P1(10)=A(1+52)n+B(152)n,
for some coefficients A,B. To determine A,B we can either diagnoalize M explicitly, or just set up a linear system using known values of f. Since f(0)=1 and f(1)=2, the latter approach shows that
A+B=11+52A+152B=2
Solving this system (e.g. using Gaussian elimination), we find out that A=5+3510 and B=53510. Therefore
f(n)=5+3510(1+52)n+53510(152)n=Θ(λmaxn), where λmax=1+52.
The same approach works for every regular language.

This is a fun approach! I always love seeing linear algebraic reductions for path related problems :)
Lee

4

@Lee Gao's is too complex (I haven't even read the whole thing), here is a simplistic approach:

Let f(n) be all desired strings out of which let a(n) be strings that end at a and b(n) be strings that end at b.

Now for every string that ends at b we can directly add a to get ba in ending and a valid string:

(1)a(n)=b(n1)
Note than we cannot add a to end of strings that end at a otherwise we will have aa at the end.

We can add b to any string:

(2)b(n)=a(n1)+b(n1)

Now nn1 in (1) and substitue in (2):

b(n)=b(n2)+b(n1)
So b(n) is fib(n) and since a(n) is b(n-1) hence a(n) is fib(n-1). Now f(n) is:
f(n)=a(n)+b(n)=fib(n)+fib(n1)=fib(n+1)
As fib(n) is (φnφn)/5, hence f(n) is O(φn), φ=1+521.618. (Taking φ/5 as constant and neglecting φn for large n to get an asymptote)

Note: fib(0)=0, fib(1)=1.


No entanto, seu limite superior não é muito bom: todos os idiomas {uma,b} tem no máximo 2n palavras de comprimento n!
Yuval Filmus

@YuvalFilmus what's the problem, you want a closer bound then use fib(n)=(ϕnϕn)/5
RE60K

This is great! The pairs lock-step inductive constructions of a and b was what I was thinking of as well.
Lee
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.