This shows you the differences between two versions of the page.
sd-ca:teme:teme-04 [2015/04/29 22:29] alexandru.olteanu [Tema 4] |
sd-ca:teme:teme-04 [2015/05/26 09:25] (current) alexandru.farcasanu [Tema 4] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Tema 4 ====== | ====== Tema 4 ====== | ||
- | Termen de predare: **Duminica, 24 Mai 2015, ora 23:55** | + | Termen de predare: **Luni, 25 Mai 2015, ora 23:55** |
- | Deadline hard: **Miercuri, 27 Mai, ora 23:55** | + | Deadline hard: **Joi, 28 Mai, ora 23:55** |
+ | |||
+ | <note important> | ||
+ | **1 Mai** Adaugat precizare legata de reprezentantul unui nod. Actualizat arhiva de teste. | ||
+ | |||
+ | **23 Mai** Modificare deadline: 25 Mai. | ||
+ | |||
+ | **24 Mai** Update script testare: limita de timp a fost marita la 100 de secunde. | ||
+ | </note> | ||
===== Obiective ===== | ===== Obiective ===== | ||
Line 49: | Line 57: | ||
* dacă probabilitate(Nod1) < probabilitate(Nod2), atunci Nod1 > Nod2 (ordinea se inversează), şi viceversa. | * dacă probabilitate(Nod1) < probabilitate(Nod2), atunci Nod1 > Nod2 (ordinea se inversează), şi viceversa. | ||
* dacă probabilitate(Nod1) = probabilitate(Nod2), atunci ne uităm la înălţimea nodului în arbore, şi dacă înălţime(Nod1) < înălţime(Nod2), atunci Nod1 > Nod2 (ordinea se inversează), şi viceversa. | * dacă probabilitate(Nod1) = probabilitate(Nod2), atunci ne uităm la înălţimea nodului în arbore, şi dacă înălţime(Nod1) < înălţime(Nod2), atunci Nod1 > Nod2 (ordinea se inversează), şi viceversa. | ||
- | * dacă probabilitate(Nod1) = probabilitate(Nod2), şi înălţime(Nod1) = înălţime(Nod2), atunci Nod1 = Nod2. | + | * dacă probabilitate(Nod1) = probabilitate(Nod2), şi înălţime(Nod1) = înălţime(Nod2), atunci ne uitam la reprezentantii nodurilor (vezi definitie mai jos). Daca reprezentant(Nod1) < reprezentant(Nod2) atunci Nod1 > Nod2 (ordinea se inversează), si viceversa. |
- | Practic, aceste reguli specifică ordinea în care se vor scoate elementele din coadă: se preferă cele cu probabilitate mică, iar dacă sunt mai multe cu aceeaşi probabilitate, le vom lua pe cele de pe nivelurile cele mai mici, pentru a păstra echilibrat arborele Huffman. | + | Practic, aceste reguli specifică ordinea în care se vor scoate elementele din coadă: se preferă cele cu probabilitate mică, iar dacă sunt mai multe cu aceeaşi probabilitate, le vom lua pe cele de pe nivelurile cele mai mici, pentru a păstra echilibrat arborele. Daca si inaltimile sunt egale, luam in considerare reprezentantul. Astfel vom avem un mod unic de a scoate elementele din coada prioritara. |
+ | |||
+ | **Reprezentantul** unui nod se defineste in felul urmator: | ||
+ | * daca nodul este frunza, reprezentantul este caracterul(octetul) asociat frunzei respective (In exemplul de [[sd-ca:teme:doc-tema04|aici]] reprezentantii tuturor frunzelor sunt 'a', 'n', ' ', 'r', 'e', 'm'). | ||
+ | * altfel, reprezentant(Nod) = minim {reprezentant(Nod_stanga), reprezentant(Nod_dreapta)} unde Nod_stanga si Nod_dreapta sunt fii nodului Nod. | ||
==== Serializare ==== | ==== Serializare ==== | ||
Line 73: | Line 85: | ||
* ''value'' reprezintă valorea simbolului (valoarea octetului) din frunza arborelui; | * ''value'' reprezintă valorea simbolului (valoarea octetului) din frunza arborelui; | ||
* ''childData'' reprezintă informaţii despre descendenţi, în cazul nodurilor neterminale; leftChild şi rightChild reprezintă indecşi în vectorul de structuri (indexarea porneşte de la 0), şi indică structurile ce codifică descendenţii stâng, respectiv drept, ai nodului. Trebuie remarcat faptul că într-un arbore Huffman, un nod fie este terminal, fie are exact doi descendenţi, deci cele două câmpuri vor fi valide simultan. De asemenea, structura de pe poziţia 0 din vector va fi rădăcina arborelui Huffman. | * ''childData'' reprezintă informaţii despre descendenţi, în cazul nodurilor neterminale; leftChild şi rightChild reprezintă indecşi în vectorul de structuri (indexarea porneşte de la 0), şi indică structurile ce codifică descendenţii stâng, respectiv drept, ai nodului. Trebuie remarcat faptul că într-un arbore Huffman, un nod fie este terminal, fie are exact doi descendenţi, deci cele două câmpuri vor fi valide simultan. De asemenea, structura de pe poziţia 0 din vector va fi rădăcina arborelui Huffman. | ||
+ | |||
+ | <note tip> | ||
+ | Observam ca reprezentantul unui nod nu este salvat in fisier deoarece nu mai avem nevoie de el. Acesta a fost folosit pentru a garanta o secventa unica de extragere a nodurilor din coada prioritara. | ||
+ | </note> | ||
După ce este scris arborele Huffman se scrie şi dimensiunea fişierului de intrare ca un element de tip întreg fara semn(necesar la decomprimare pentru a şti câte simboluri trebuie decodificate). Urmează simbolurile scrise codificat în ordinea în care au fost citite din fişierul original. În urma aplicării arborelui Huffman asupra simbolurilor, se obţine un şir de biţi. | După ce este scris arborele Huffman se scrie şi dimensiunea fişierului de intrare ca un element de tip întreg fara semn(necesar la decomprimare pentru a şti câte simboluri trebuie decodificate). Urmează simbolurile scrise codificat în ordinea în care au fost citite din fişierul original. În urma aplicării arborelui Huffman asupra simbolurilor, se obţine un şir de biţi. | ||
Line 109: | Line 125: | ||
^Camp|**K**| **V** | **N** | **L**| | ^Camp|**K**| **V** | **N** | **L**| | ||
^Semnificatie|numarul de noduri din arbore| arborele serializat | dimensiunea fisierului original | fisier comprimat| | ^Semnificatie|numarul de noduri din arbore| arborele serializat | dimensiunea fisierului original | fisier comprimat| | ||
- | ^Tip/Dimensiune | 1 * uint16_t | K * HuffmanSerializedNode | 1 * uint32_t | sir de biti de lungime variabila | | + | ^Tip/Dimensiune | 1 * uint16_t | K * HuffmanSerializedNode | 1 * uint32_t | sir de biti ce reprezinta fisierul comprimat | |
===== Testare ===== | ===== Testare ===== | ||
Line 129: | Line 145: | ||
===== Alte precizari ===== | ===== Alte precizari ===== | ||
+ | * Atunci cand se construieste un nod nou, nodul cel mai prioritar din coada va deveni fiul **stang** al noului nod. | ||
+ | * Serializarea arborelui se va face printr-o parcurgere in **preordine**. | ||
* Se recomanda ca atat citirea cat si scrierea sa se realizeze cu functiile fread si fwrite. | * Se recomanda ca atat citirea cat si scrierea sa se realizeze cu functiile fread si fwrite. | ||
* Se recomanda folosirea tipurile de date uint8_t, uint16_t si uint32_t in cazul citirii si scrierii din fisiere. | * Se recomanda folosirea tipurile de date uint8_t, uint16_t si uint32_t in cazul citirii si scrierii din fisiere. |