Quindi non ne sono completamente sicuro, ma penso che tu stia chiedendo di contare il numero di stringhe di dimensioni n (sopra l'alfabeto { a , b }) dove il fattore / sottostringa a a non appare giusto?
In questo caso, ci sono alcuni approcci combinatori che puoi adottare. Sia Yuval che ADG hanno fornito argomenti più semplici e intuitivi, quindi consiglio vivamente di dare un'occhiata alle loro risposte! Ecco uno dei miei preferiti, è un po 'strano, ma è un approccio molto generale (e un po' divertente).
Cominciamo con un linguaggio più semplice, quello delle parole che iniziano e finiscono con B (anche senza sottostringhe di a a). Possiamo guardare una stringa ammissibile (esb b b a b a b b b b) come un elenco di sequenze di Bs separati da singolare un'S. Questo dà la costruzione:
w = (B+un')*B+
Ora, come contiamo le frasi che appartengono a questa lingua?
Immaginiamo che stiamo espandendo queste espressioni. Cosa fae*denota? Bene, è semplicemente
e*= ϵ ∣ e ∣ e e ∣ e e e ∣ e e e e ∣ …
Ora, questo avrà molto poco senso, ma immaginiamolo
eè una variabile su un campo numerico. In particolare, tratteremo
ϵ → 1,
a ∣ b → a + b, e
a b c → a × b × c. Questo poi dice questo
e*→ 1 + e + e e + e e e + ...
Proviamo a vedere la motivazione dietro questa strana interpretazione. Questa è
quasi una trasformazione biiettiva. In particolare, vogliamo preservare il
conteggio di ciascuno
enparola, che, come puoi facilmente vedere, facciamo. Tuttavia, esiste una differenza cruciale tra le espressioni di stringa e le espressioni numeriche: la moltiplicazione (concatenazione in stringhe,
×in espressioni numeriche) è ora commutativo! Intuitivamente, la commutatività ci consente di trattare tutte le permutazioni della stessa parola come la stessa; cioè, non chiariamo le ambiguità tra l'espressione
bbbab e
bbabb; entrambi rappresentano una stringa con 4
bse uno
a. Pertanto, questa trasformazione ci consente di preservare il conteggio di ogni parola di un certo numero di
as e
bs, ma ora ci consente di chiudere un occhio sui dettagli superflui che non ci interessano.
Se torni al precalcolo, potresti riconoscere questa serie come 11−e. So che non ha senso riscrivere questa espressione regolare come una funzione a valore numerico, ma resta nuda con me per un momento.
Allo stesso modo, e+=ee∗→e1−e. Ciò significa che possiamo tradurrew in
w →11 - (B1 - b× a )×B1 - b
A sua volta, possiamo semplificare questo fino a
w ( a , b ) = b ×11 - ( b + b a )
Questo ci dice che la lingua w è isomorfo alla lingua b ( b ∣ a b)* (la cui traduzione diretta è già B1 - b - b a) senza mai ricorrere a strumenti teorici del linguaggio! Questo è uno dei poteri di trattare queste serie come funzioni a forma chiusa: possiamo eseguire su di esse delle semplificazioni che sono quasi impossibili da eseguire altrimenti, riducendole quindi a un problema più semplice.
Ora, se ricordi ancora qualcuno dei tuoi corsi di calcolo, ricorderai che certi tipi di funzioni (essendo abbastanza ben comportati) ammettono queste rappresentazioni di serie note come espansioni di Taylor. Non preoccuparti, non dovremo davvero preoccuparci di quei fastidiosi problemi di Calc 1; Sto solo sottolineando che queste funzioni possono essere rappresentate come la somma
w ( a , b )=Σio , jwio jun'ioBj
così che
wio j dà il numero di parole che soddisfa
w tale che ha esattamente
io occorrenze di
un' e
j occorrenze di
B. Tuttavia, non ci interessa particolarmente se qualcosa è un
un' o a
B. Piuttosto, ci preoccupiamo solo del numero totale di caratteri nella stringa. Per chiudere un "occhio cieco" tra
un' e
B, possiamo semplicemente (letteralmente) trattarli allo stesso modo, ad esempio let
z= a = b e prendi
w ( z) = w ( z, z) =z1 - z-z2=ΣKwKzK
dove wK conta il numero di parole soddisfacenti di lunghezza K.
Ora non resta che trovare wK. Il solito approccio combinatorio qui sarebbe quello di scomporre questa funzione razionale nella sua frazione parziale: cioè, dato il denominatore1−z−z2=(z−ϕ)(z−ψ), possiamo riscrivere z(z−ϕ)(z−ψ)=Az−ϕ+Bz−ψ(C'è un po 'di algebra coinvolta qui, ma questa è una proprietà universale delle funzioni razionali (un polinomio che ne divide un altro)). Per risolvere questo, puoi refactoring
Az−ϕ+Bz−ψ=z(z−ϕ)(z−ψ)
che genera i vincoli
A+B=1,Aψ+Bϕ=0. Indipendentemente da cosa
A e
B ricordalo
11−x=1+x+x2+…bene, possiamo riordinare
w(z)=−Aϕ−z+−Bψ−z=(−Aϕ)11−zϕ+(−Bψ)11−zψ=(−Aϕ)(1+ϕ−1z+ϕ−2z2+…)+(−Bψ)(1+ψ−1z+ψ−2z2+…)
perciò
wk=(−Aϕ)ϕ−k+(−Bψ)ψ−k
Qui,
ϕ è il rapporto aureo
1+5√2 e
ψ=−ϕ−1è il suo coniugato. Abbiamo quindi una facile descrizione del comportamento asintotico del
w lingua: corre dentro
Θ(ϕn). In effetti, se espandi tutto, lo scoprirai
wk=ϕk−ψk5–√=⌈ϕk5–√⌉
C'è anche una complessa connessione con un'altra classe combinatoria comune. Questi sono solo i numeri di Fibonacci!
Ora, supponi di averlo fatto wk, che conta il numero di stringhe di dimensioni k che inizia e finisce con k (e contiene anche n aa sottostringhe), come possiamo costruire una stringa che può iniziare o terminare con un a? Bene, è semplice: è presente anche una stringa ammissibilew (inizia e finisce con b) o lo è aw (inizia con a) o lo è wa (finisce con a) o lo è awa (inizia e finisce con a). Perciò:
f(n)=wn+wn−2+2∗wn−1
Richiama questo
wn è la sequenza dei fibonacci, quindi
wn−1+wn−2=wn, che significa che
f(n)=(wn+wn−1)+(wn−2+wn−1)=wn+1+wn=wn+2
Perciò,
f(n)=fib(n+2)=⌈ϕn+25√⌉
Ora probabilmente non devi fare questa analisi, ma solo avere l'intuizione che questa sequenza è una sequenza di Fibonacci spostata dovrebbe darti un'idea di alcune altre interpretazioni combinatorie che puoi provare.