[RISOLTO, Algoritmi] Quanti alberi binari propri si possono formare con n nodi?
Salve! Vi chiedo gentilmente di aiutarmi con il mio problema.
conoscete per caso qualche formula o forse vi viene in mente qualche idea matematica per trovare il numero di alberi binari propri diversi strutturalmente che si possono costruire con n nodi?
Per albero proprio intendo albero binario i cui nodi hanno due soli figli (a parte le foglie che non ce li hanno).
L'ho messo in informatica perché ho scritto un algoritmo ricorsivo (java) che lo risolve ma non so se è giusto perché ho perso un'ora a farlo facendo varie correzioni con questo magari rendendolo efficiente solo per i primi casi che sono riuscito a verificare a mano sul foglio. (n=3, n=5, n=7, n=9) però per esempio per n=9 non andava e ho dovuto fare una correzione. Per n>9 ormai non ho voglia di verificare a mano.
Se volete verificarlo guardando il codice è dura spiegarvelo ma sicuramente le sue prestazioni temporali fanno pellagra. Si basa sul fatto che togliendo ogni volta 2*k nodi da uno dei sottoalberi rimango con 2*k+1 nodi dall'altro sottoalbero e le combinazioni che si creano a loro volta se moltiplicate e sommate mi danno il risultato totale. Siccome tanti casi i ripetono per simmetria li moltiplico per 2. Quelli invece in cui l'albero (o sottalbero preso) sono "bilanciati" cioè stesso numeri di nodi, mi sono accorto che non conviene moltiplicarli per 2 perché non si ripetono. Insomma se qualcuno riesce a verificarlo per numeri più grandi di 9 o conosce qualche formula mi aiuta molto:
conoscete per caso qualche formula o forse vi viene in mente qualche idea matematica per trovare il numero di alberi binari propri diversi strutturalmente che si possono costruire con n nodi?
Per albero proprio intendo albero binario i cui nodi hanno due soli figli (a parte le foglie che non ce li hanno).
L'ho messo in informatica perché ho scritto un algoritmo ricorsivo (java) che lo risolve ma non so se è giusto perché ho perso un'ora a farlo facendo varie correzioni con questo magari rendendolo efficiente solo per i primi casi che sono riuscito a verificare a mano sul foglio. (n=3, n=5, n=7, n=9) però per esempio per n=9 non andava e ho dovuto fare una correzione. Per n>9 ormai non ho voglia di verificare a mano.
Se volete verificarlo guardando il codice è dura spiegarvelo ma sicuramente le sue prestazioni temporali fanno pellagra. Si basa sul fatto che togliendo ogni volta 2*k nodi da uno dei sottoalberi rimango con 2*k+1 nodi dall'altro sottoalbero e le combinazioni che si creano a loro volta se moltiplicate e sommate mi danno il risultato totale. Siccome tanti casi i ripetono per simmetria li moltiplico per 2. Quelli invece in cui l'albero (o sottalbero preso) sono "bilanciati" cioè stesso numeri di nodi, mi sono accorto che non conviene moltiplicarli per 2 perché non si ripetono. Insomma se qualcuno riesce a verificarlo per numeri più grandi di 9 o conosce qualche formula mi aiuta molto:
public static int getQ(int n) { if(n<=3) return 1; int s=0, r=0; for(int i=1; 2*i<=(n+1)/2; i++) { r = getQ(n-2*i)*getQ(2*i-1); if(2*i-1 != n-2*i) r *= 2; s+=r; } return s; }
Risposte
Trovato: il numero di alberi binari che si possono costruire sotto queste condizioni è il numero di Catalan
A chi interessasse l'algoritmo: FUNZIONA.
A chi interessasse l'algoritmo: FUNZIONA.