Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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: **Duminica24 Mai 2015, ora 23:55**+Termen de predare: **Luni ​25 ​Mai 2015, ora 23:55**
  
-Deadline hard: **Miercuri27 Mai, ora 23:55**+Deadline hard: **Joi28 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. ​
sd-ca/teme/teme-04.1430335779.txt.gz · Last modified: 2015/04/29 22:29 by alexandru.olteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0