function adaptive_huffman
	
	% parametri della sorgente senza memoria con entropia assegnata
	N = 8;
	H = 1.5;
	p = dmp(N,H);
	
	% inizializzazione dei vettori delle frequenze relative
	count1 = zeros(1,N);

	% messaggio da trasmettere
	N_sym = 100;
	a = DMS(p,N_sym);

	% messaggio codificato
	c = [];
	
	% vettore delle statistiche sulla lunghezza media del codice
	acl = zeros(1,N_sym);
	
	for sym = 1:N_sym
		
		% vettore delle frequenze relative
		if sym == 1
			p1 = ones(1,N)/N;
		else
			% i simboli utili sono tutti tranne quello attuale 
			p1 = count1/(sym-1);
		end
		
		% costruzione dell'albero
		T1 = huffman_tree(p1);
		
		% calcolala lunghezza media del codice
		acl(sym) = huffman_average_code_length(T1,p);
		
		% codifica
		c = [c,huffman_encode(T1,a(sym))];
		
		% aggiornamento dei contatori
		count1(a(sym)) = count1(a(sym)) + 1;
	end

	% visualizza l'evoluzione della lunghezza media del codice
	figure(1)
	hold off
	plot(1:N_sym,acl);
	hold on
	plot([1,N_sym],[H,H],'r--');
	plot(1,0)
	
	% vettore delle frequenze relative del ricevitore
	count2 = zeros(1,N);

	% inizialmente consideriamo tutto il messaggio come 'resto' non ancora
	% decodificato
	r = c;

	% messaggio decodificato
	a_rx = [];
	N_rx = 0;

	% questo va bene solo perché sappiamo che il messaggio codificato contiene
	% un numero intero di simboli
	while numel(r)
	
		% stessa inizializzazione del trasmettitore
		if N_rx == 0
			p2 = ones(1,N)/N;
		else
			% i simboli utili sono tutti tranne quello attuale
			p2 = count2/N_rx;
		end

		% costruisci l'albero di decodifica
		T2 = huffman_tree(p2);
		
		% decodifica un simbolo (perché il trasmettitore ricostruisce l'albero
		% ad ogni simbolo trasmesso)
		[temp,r] = huffman_decode(T2,r,1);

		% aggiorna i contatori per il prossimo loop
		count2(temp) = count2(temp) + 1;

		% appendi il simbolo decodificato al messaggio
		a_rx = [a_rx,temp];
		N_rx = N_rx + 1;
	end

	% verifica finale
	if numel(a) == numel(a_rx) && sum(a == a_rx) == N_sym
		fprintf('ALL OK! [H: %g, average bit/sym: %g]\n',H,numel(c)/N_sym);
	end
end
