La codifica di Huffman Un'implementazione in C++ (parte del materiale è opera di Mark Nelson, Dr. Dobb’s Journal, Gennaio 1996)‏

Slides:



Advertisements
Presentazioni simili
1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Advertisements

Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Heap Ordinamento e code di priorità Ugo de Liguoro.
Alberi binari Definizione della struttura dati: struct tree { };
Ricerca sequenziale in un array di interi
Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest,
Generazione di codice dinamico per la realizzazione di catene di servizi componibili Progetto di Reti di Calcolatori LS A.A. 2007/08 Studente: Silvia Cereda.
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
La codifica di Huffman. Codici ottimi - I Un codice è ottimo se ha la lunghezza media di parola L più piccola Si può vedere come un problema di ottimizzazione.
Code con priorità Moreno Marzolla Dip. di Scienze dell'Informazione Università di Bologna
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
© 2007 SEI-Società Editrice Internazionale, Apogeo
Il Sistema Operativo Gestione dei Processi
Progettare algoritmi veloci usando strutture dati efficienti
Inserzione e Cancellazione
Progettare algoritmi veloci usando strutture dati efficienti
Analisi di sequenze di operazioni Union-Find
Lezione n°9 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Alberi binari Definizione Sottoalberi Padre, figli
Rappresentazione di alberi
Rappresentazione di alberi binari
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Pila.h struct Pila { int size; int defaultGrowthSize; int marker;
I FILES AD ACCESSO SEQUENZIALE
TIPI PRIMITIVI TIPI STRUTTURATI
JAVA usa una rappresentazione in VIRGOLA MOBILE
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Vettori dinamici Definiremo la classe vector.
Algoritmi e Strutture Dati
Java World Cicli e Array.
Controllo e microprogrammazione
Corso Java Esercizi.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Rappresentazione di alberi
Copia di oggetti il costruttore di copia ha le stesse particolarità della signature di un costruttore ordinario; il primo parametro è una reference ad.
Scheduling in Linux (Kernel 2.4 e 2.6)
Tipo String String è una classe predefinita
Introduzione agli Algoritmi e alle Strutture Dati
Heapsort.
Alberi n-ary Lezioni di C.
APPUNTI SUL LINGUAGGIO C
Algoritmi e Strutture Dati
Progettare algoritmi veloci usando strutture dati efficienti
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
Algoritmi e Strutture Dati
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
LINGUAGGIO C Alberi e livelli
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Grafi e problem solving
Lezione n°7 Splay-Trees e Heaps Prof.ssa Rossella Petreschi
concetti ed applicazioni
Insiemi disgiunti.
Usando strutture dati nella piattaforma Java Collections Framework
Algoritmi e Strutture Dati
Unione per ranghi compressi
Array e Stringhe Linguaggio C.
Ricerca 01/08/2019 package.
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Ese 3 (del 3 Aprile 2003).
Programmazione Procedurale
Corso di programmazione, Simulazione, ROOT, code, ecc. ecc.
Transcript della presentazione:

La codifica di Huffman Un'implementazione in C++ (parte del materiale è opera di Mark Nelson, Dr. Dobb’s Journal, Gennaio 1996)‏

Perché C++ Nessuna ragione particolare, andavano benissimo anche il C, il Java e molti altri Il vantaggio principale dell'uso del C++ è di poter utilizzare la STL (Standard Template Library)‏

Cos'è la STL E' una libreria di templates Un template è una classe che ha un tipo di dato parametrico (per inciso, questo tipo di dato può essere un tipo di dato primitivo, o una classe a sua volta)‏ vector, queue

Coda FIFO Operazioni: push(), pop()‏ Molto semplice da implementare, ma talvolta avremmo bisogno di qualcosa di un po' più sofisticato

Coda con priorità In una coda con priorità ogni elemento ha una priorità I nuovi elementi vengono aggiunti con la funzione push() Con la funzione pop() si estrae un elemento dalla coda. In un coda con priorità questo elemento non è il più vecchio ma quello con priorità massima Questo può essere utile in certi tipi di task, ad esempio nello scheduler di un sistema operativo

Coda con priorità

Implementazione con uno heap Una possibile implementazione efficiente di una coda con priorità si serve di uno heap Uno heap è una struttura dati che tiene gli elementi della coda in uno stato parzialmente ordinato. Inserzione ed estrazione costano log(N) in tempo, dove N è il numero di elementi nella coda Anche l'overhead di memoria è praticamente nullo

Heap Gli elementi di uno heap sono memorizzati in un array contiguo (diciamo, per comodità, dalla posizione 1 alla posizione N)‏ Gli elementi nell'array fanno parte di un albero binario implicito. Ogni elemento x (eccetto il nodo radice) ha il padre in x/2 (intero inferiore) Ogni nodo ha una priorità che è maggiore o uguale a quella di entrambi i suoi figli

Heap

Heap: push()‏ swap

Heap: pop()‏ Qualcosa di simile accade quando si esegue la funzione pop()...

STL priority_queue Implementa una coda con priorità con uno heap Non abbiamo bisogno di ricordare tutti i dettagli dello heap e della ristrutturazione dell'albero implicito perché... è tutto automatico!

Huffman: implementazione - I Class node { public: int weight; unsigned char value; const node *child0; const node *child1;

Huffman: implementazione - II node(unsigned char c=0, int i=-1) { value=c; weight=i; child0=0; child1=0; } node(const node *c0, const node *c1) { value=0; weight=c0->weight + c1->weight; child0=c0; child1=c1; } Costruttori

Huffman: implementazione - III Operatore di confronto bool operator>(const node &a) const { return weight > a.weight; }

Il ciclo fondamentale while (q.size()>1) { node *child0 = new node(q.top()); q.pop(); node *child1 = new node(q.top()); q.pop(); q.push(node(child0, child1)); } e ora, diamo un'occhiata ai risultati...

Implementare una versione che accetti un qualunque file di testo Calcolare L(X), H(X)‏ Realizzare la stessa implementazione in Java o in C. Quale è più difficile? Aggiungere il controllo del tempo di elaborazione Compiti per casa