[Powered by Google Translate] [Walkthrough - Problem Set 6] [Zamyla Chan - Sveučilište Harvard] [Ovo je CS50. - CS50.TV] Pozdrav, svima, i dobrodošli na Walkthrough 6: Huff'n Puff. U Huff'n lisnato ono što mi radimo će se baviti datoteku Huffman komprimiranog i onda ga puffing natrag gore, pa ga dekompresije, tako da možemo prevesti iz 0s i 1s da korisnik nam šalje i pretvoriti ga natrag u izvornom tekstu. Pset 6 će biti prilično cool jer si idući u vidjeti neke od alata koje ste koristili u pset 4 i 5 pset i vrsta kombinirajući ih u jednom prilično uredan koncept kada dođete do razmišljati o tome. Također, nedvojbeno, pset 4 i 5 su najproblematičniji psets da smo imali za ponuditi. Dakle, od sada, imamo ovaj jedan više pset u C, i onda nakon toga smo na web programiranje. Tako sami čestitati za dobivanje preko najtežih grba u CS50. Premještanje na za Huff'n lisnato, naša kutija za ovaj pset će biti Huffman stabala, tako da razumijevanje ne samo kako binarnog stabla rad, ali i konkretno Huffman stabla, kako oni izgrađeni. A onda ćemo imati puno distribucije koda u ovom pset, a mi ćemo doći vidjeti kako zapravo neke od koda mi možda neće biti u mogućnosti u potpunosti razumjeti, ali, pa oni će biti. c slika, ali onda su njihovi popratni. h slika će nam dati dovoljno razumijevanja da trebamo da znamo kako te funkcije rade ili barem ono što su trebali učiniti - njihovi ulazi i izlazi - čak i ako ne znamo što se događa u crnoj kutiji ili ne razumiju što se događa u crnoj kutiji roku. I onda na kraju, kao i obično, mi smo se bave novim strukturama podataka, određene vrste čvorova koji upućuju na određene stvari, pa ovdje ima olovku i papir, ne samo za proces projektiranja i kada pokušavate shvatiti kako vaš pset treba raditi , ali i tijekom ispravljanje pogrešaka. Možete imati GDB uz svoje olovke i papira dok vas odvesti dolje što su vrijednosti, gdje strelice ukazuju, i slične stvari. Prvo pogledajmo Huffman stabala. Huffman stabla su binarni drveće, što znači da je svaki čvor ima samo 2 djece. U Huffman stabala karakteristika je da su najčešći vrijednosti predstavljeni su i najmanje komadiće. Vidjeli smo u predavaonicama primjera Morse koda, koja vrsta konsolidirane neki slova. Ako pokušavate prevesti A ili E, na primjer, ti si prevodio da često, pa umjesto da koriste cijeli set bitova sredstva za tu uobičajenu vrstu podataka, možete ga stisnuti prema dolje na manje, i onda ta slova koji su zastupljeni rjeđe zastupljene su s više bitova jer si možete priuštiti da kada odmjeriti frekvencije koje ta slova pojavljuju. Imamo istu ideju ovdje u Huffman stabala gdje smo izradu lanac, svojevrsni put doći do određenih likova. A onda su likovi koji imaju najviše frekvencije će biti zastupljena s najmanje bita. Način na koji ćete izgraditi Huffman stablo je stavljanjem svi likovi koji se pojavljuju u tekstu i izračuna njihovu učestalost, koliko često se pojavljuju. To je mogao biti računati koliko puta ta slova pojavljuju ili možda postotak od svih likova koliko svatko se pojavljuje. I tako ono što trebate učiniti je kada imate sve te zacrtao, onda ste u potrazi za dvije najnižih frekvencija, a zatim im se pridruže kao braće i sestara gdje onda roditelj čvor ima frekvenciju koja je zbroj njegovih 2 djece. I onda po konvenciji reći da je lijeva čvor, slijedite da slijedeći 0 granu, a zatim desni čvor je 1 granu. Kao što smo vidjeli u Morse kodu, onaj Gotcha je da ako ste imali samo zvučni signal i zvučni signal to je bio neodređen. To je mogao biti jedan dopis ili to može biti slijed dva slova. I tako ono što Huffman stabala radi jer po prirodi likova ili naše konačne stvarni likovi su posljednji čvorovi na grani - mislimo na one što lišća - samim tim ne može biti bilo dvosmislenosti u terminima koje slovo ste pokušavali kodirati s nizom bitova jer nigdje uz bitova koji predstavljaju jedan dopis ćete naići na još jedan cijeli pismo, i tu neće biti nikakvih konfuzija tamo. No, mi ćemo ići na primjerima da vi zapravo može vidjeti da umjesto nas samo reći da je to istina. Pogledajmo jednostavan primjer Huffman stabla. Imam niz ovdje da je 12 znakova. Imam četiri Kao, 6 BS, i dva CS. Moj prvi korak bio bi računati. Koliko puta se pojavljuju? Čini se četiri puta u nizu. B pojavljuje 6 puta, i C se 2 puta. Naravno, ja ću reći da sam pomoću B najčešće, pa želim da predstavljaju B s najmanjim brojem bitova, najmanji broj 0S i 1S. I onda ja idem očekivati ​​C zahtijevati najveći iznos 0S i 1s kao dobro. Prvo što sam učinio ovdje sam stavio ih u rastućem poretku u smislu frekvencije. Vidimo da je C i, oni su naši dvije najniže frekvencije. Mi stvaramo roditeljski čvor, a da roditelj čvor ne imati pismo povezane s njom, ali ona ima frekvenciju, što je zbroj. Zbroj postaje 2 + 4, koji je 6. Onda smo slijediti lijevu granu. Ako smo bili u tom 6 čvora, onda bismo slijediti 0 doći do C i onda jednom doći do A. Dakle, sada imamo dva čvorova. Imamo vrijednost 6, a onda imamo još jedan čvor s vrijednošću 6. I tako one dvije nisu samo dvije najniže ali i samo dva koja su ostavila, tako da smo se pridruže onima drugi roditelj, sa zbrojem koji 12. Dakle, ovdje imamo Huffman stablo gdje doći do B, da bi samo biti malo 1 i onda doći do bismo imati 01, a zatim C ima 00. Dakle, ovdje vidimo da je u osnovi smo zastupa ove znakova s ​​bilo 1 ili 2 bita gdje je B, kao što je predviđeno, ima najmanje. I onda smo očekivali C imaju najviše, ali budući da je kao mali Huffman stablo, tada također predstavlja dva bita za razliku negdje u sredini. Samo da ide preko drugog jednostavnom primjeru Huffman stabla, kažu da imaju niz "Zdravo". Što trebate učiniti je prvo što će reći koliko puta se H pojaviti u to? H pojavljuje jednom, a zatim e se jednom i onda imamo l pojavljuju dva puta te o pojavljuju jednom. I tako onda očekujemo koje slovo da ga zastupa najmanjim brojem bita? [Student] l. >> L. Aha. l je u pravu. Očekujemo l moraju predstavljati najmanjim brojem bitova jer sam se najviše koristi u nizu "Halo". Što ću učiniti sada je izvući iz ove čvorove. Imam 1, koji je H, a zatim još 1, što je E, a zatim 1, što je o - sada sam stavljajući ih u cilju - a zatim 2, koji je l. Tada sam rekao ono što sam izgraditi Huffman stablo je pronaći dvije čvorova sa najmanje frekvencijama i učiniti ih siblings stvaranjem roditeljski čvor. Ovdje imamo tri čvora s najnižom učestalosti. Oni su svi jedan. Dakle, ovdje ćemo odabrati koji ćemo povezati prvi. Ajmo reći da sam izabrati H i E. Zbroj 1 + 1 je 2, ali to čvor ne imati pismo povezane s njom. To samo ima vrijednost. Sada ćemo pogledati u narednih dva najnižim frekvencijama. To je 2 i 1. To bi mogao biti bilo koji od tih dva, ali ja ću izabrati ovu. Zbroj je tri. I onda na kraju, imam samo dva lijevo, pa onda to postaje 5. Onda ovdje, kao što se očekuje, ako sam ispunite kodiranje za to, 1s uvijek pravo grana i 0s su lijevi. Onda imamo l zastupa samo jedan zalogaj i onda je O po dva a zatim e po 2, a zatim H padne na 3 bita. Dakle, možete prenijeti tu poruku "Hello" umjesto zapravo koristi znakove po samo 0s i 1s. Međutim, ne zaboravite da je u nekoliko slučajeva koje smo imali veze s našim frekvencije. Mogli bismo ni pridružili su H i O prvi možda. Ili onda kasnije, kada smo imali l zastupa dvoje kao i pridružio jedan zastupao 2, mogli smo povezani ni jedan. I tako kada poslati 0s i 1s, koji zapravo ne jamči da primatelj može u potpunosti pročitati vašu poruku pravo isključiti šišmiš jer oni ne mogu znati što ste napravili odluku. Dakle, kada imamo posla s Huffman kompresije, nekako moramo reći primatelja naše poruke kako smo odlučili - Oni moraju znati nekakav dodatne informacije osim komprimiranog poruke. Oni trebaju shvatiti što je stablo zapravo izgleda, kako mi je zapravo napravio tih odluka. Ovdje smo samo radili primjere na temelju stvarnog broja, ali ponekad možete imati Huffman stablo temelji se na frekvenciji na kojoj se pojavljuju slova, a to je isti proces. Evo ja sam ga izražava u procentima ili frakcije, i tako je i ovdje točno ista stvar. Ja pronašli dva najniža ih Ukratko, sljedeći dva najniža ih zbrojiti, dok imam punu stablo. Iako bismo mogli to učiniti bilo koji način, kad smo se bavi postocima, to znači da smo dijeljenjem stvari i bave decimala odnosno pluta ako ćemo razmišljati o podatkovnih struktura glave. Što znamo o plovaka? Što je čest problem kada imamo posla s plovcima? [Student] neprecizan aritmetika. >> Da. Nepreciznost. Zbog pomičnim zarezom nepreciznosti, za ovaj pset, tako da smo bili sigurni da mi ne izgubiti sve vrijednosti, onda mi zapravo idemo se bave računati. Dakle, ako ste bili razmišljati o Huffman čvor, ako se osvrnuti na strukturu ovdje, ako pogledate zelene one ima frekvenciju povezane s njom , kao i to ukazuje na čvor na svojoj lijevoj strani, kao i čvor na njegovo pravo. I onda one crvene tamo također imaju karakter povezane s njima. Nećemo napraviti odvojene one za roditelje i zatim završnih čvorova, što mi nazivamo lišća, nego one samo imati NULL vrijednosti. Za svaki čvor ćemo imati karakter, simbol da je taj čvor predstavlja, onda frekvencija, kao i pokazivač na svojoj lijevoj djeteta, kao i svoje pravo djeteta. Listovi, koji su na samom dnu, također će imati čvor upućuje s njihove lijeve strane, a na njihova prava, ali budući da se te vrijednosti ne ukazuju na stvarne čvorova, što bi njihova vrijednost bila? >> [Student] NULL. >> NULL. Točno. Evo primjera kako biste mogli predstavljaju frekvencije u plovaka, ali mi ćemo se baviti s njim s brojeva, tako da sve što sam učinio je promijeniti tip podataka postoji. Idemo na malo više od složenog primjer. Ali sada da smo učinili jednostavne one, to je samo isti proces. Možete pronaći dvije najniže frekvencije, zbroj frekvencija i da je nova frekvencija vašeg matičnog čvora, koji je tada ukazuje na svojoj lijevoj strani s 0 podružnice i pravo s jedne grane. Ako imamo niz "Ovo je cs50", onda ćemo brojati koliko puta je T spomenuto, h je spomenuto, i, s, c, 5, 0. Onda ono što sam učinio ovdje je s crvenim čvorova sam zasađenih, Rekla sam da ću imati ove znakove na kraju na dnu mog stabla. Oni su idući u biti sve od lišća. Onda ono što sam učinio je da sam ih sortirati po učestalosti u uzlaznom redoslijedu, i to je zapravo način na koji se to radi kod pset Je li to sortira po učestalosti i onda po abecednom redu. Tako da ima brojeve, a zatim po abecednom redu frekvenciji. Onda ono što ću učiniti je ja bi pronašli dva najniža. To je 0 i 5. Ja bih ih zbrojiti, a to je dva. Onda bih nastaviti, naći sljedeći dva najniža. To su dva 1s, a onda oni postaju 2 kao dobro. Sada znam da je moj sljedeći korak će biti spajanje najmanji broj, što je T, 1, a zatim odabirom jedne od čvorova koji ima 2 kao frekvencije. Dakle, ovdje imamo tri opcije. Što ću učiniti za slajd samo vizualno ih preurediti za vas tako da možete vidjeti kako ću ga gradi. Što kod i vaš distribucija koda će učiniti da bi se pridružiti T jedan s 0 i 5 čvora. Pa onda da iznosi do tri, a onda smo se nastavi proces. The 2 i 2 sada su najniže, pa onda oni zbroj za četiri. Svatko slijedi do sada? Ok. Onda nakon toga imamo tri i tri koje je potrebno da se zbrajaju, pa opet ja sam samo to prebacivanje tako da možete vidjeti vizualno tako da se ne bi previše neuredan. Onda imamo šest, a onda je naša konačna korak je da sada imamo samo dva čvorova Ukratko ćemo one bi korijen našeg stabla, što je 10. A broj 10 ima smisla, jer svaki čvor predstavlja, njihova vrijednost, njihova učestalost broj, bio koliko puta su se pojavili u nizu, i onda imamo pet znakova u našem nizu, tako da ima smisla. Ako ćemo gledati na koliko smo zapravo bi ga kodirati, kao što se očekivalo, ja i S, koje se pojavljuju najčešće predstavljaju manjem broju bitova. Budite oprezni ovdje. U Huffman stabala slučaj zapravo važno. S velikim slovima je drugačiji nego malim slovom S. Ako smo imali "Ovo je CS50" s velikim slovima, onda je mala i pojavit će se tek dva puta, će biti čvor s dva kao svoje vrijednosti, a zatim veliko S će biti samo jednom. Pa onda vaše stablo će promijeniti strukturu jer ste zapravo imaju dodatni list ovdje. No, iznos i dalje će biti 10. To je ono što mi zapravo idemo se zovete ček, dodatak od svih računa. Sada kada smo pokriveni Huffman stabala, možemo zaroniti u Huff'n lisnato, The pset. Mi ćemo početi s dijela pitanja, i to će doći na koju ste navikli kod binarnih stabala i kako raditi oko toga: crtanje čvorovi, stvarajući svoj vlastiti typedef struct za čvor, i gledajući kako biste mogli umetnuti u binarno stablo, jedan koji je sortiran, poprijeko ga, i slične stvari. To znanje definitivno će vam pomoći kada zaronite u dijelu Huff'n Puff od pset. U standardnom izdanju pset, vaš je zadatak provesti Puff, i hakerske verziji Vaš zadatak je provesti Huff. Što Huff ipak to traje tekst i onda ga prevodi u 0s i 1s, tako da je proces koji smo radili gore, gdje smo brojali frekvencije , a zatim je stablo, a zatim je rekao: "Kako mogu dobiti T?" T predstavlja 100, slične stvari, i onda Huff bi tekst, a zatim izlaz da binarno. Ali, isto tako, jer znamo da želimo omogućiti našim primatelja poruke ponovno isti stablo, ona također sadrži informacije o frekvencijskim tačkama. Tada s lisnato smo dobili binarnu datoteku 0S i 1S i dao je također podatke o frekvencijama. Mi prevodimo sve one 0s i 1s natrag u izvornu poruku da je, tako da smo decompressing da. Ako radite standardni izdanje, ne morate provesti Huff, pa onda možete samo koristiti osoblje provedbu Huff. Tu su i upute za spec. o tome kako to učiniti. Možete pokrenuti osoblje provedbu Huff na određene tekstualne datoteke i onda koristiti taj izlaz kao ulaz za Puff. Kao što sam spomenuo prije, imamo puno distribucije koda za ovaj jedan. Ja ću početi prolazi kroz njega. Ja ću provesti većinu vremena na internetu. H slika jer u c. datoteka, jer mi imamo. h i da nam se pruža s prototipova funkcija, mi u potpunosti ne treba shvatiti točno - Ako ne razumiju što se događa u c. Datotekama, onda ne brinite previše, ali definitivno pokušati pogledati, jer bi to moglo dati neke savjete i to je korisno da se koristi za čitanje tuđe koda. Gledajući huffile.h, u komentarima to izjavljuje sloj apstrakcije za Huffman kodiranih datoteka. Ako idemo dolje, vidimo da je maksimalno 256 znakova koje smo možda trebati kodove za. To uključuje sve slova abecede - velikih i malih - i onda simboli i brojevi, itd. Onda ovdje imamo čarobni broj identificira Huffman-coded datoteku. Unutar Huffman koda oni će imati određenu čarobnu broj povezan s zaglavlja. To bi moglo izgledati samo slučajnih čarobni broj, ali ako zaista prevesti ga u ASCII, onda je to zapravo navodi Huff. Ovdje imamo struct za Huffman-kodirane datoteke. Tu je sve od tih karakteristika povezanih s Huff datoteku. Onda ovdje dolje imamo zaglavlje za ljutnja datoteku, tako da mi to zovemo Huffeader umjesto dodajući dodatni h jer to zvuči isto svejedno. Slatka. Imamo čarobni broj povezan s njim. Ako je stvarna Huff datoteke, to će biti broj gore, ovaj čarobni jedan. A onda će imati niz. Dakle, za svaki simbol, od kojih su 256, to će navesti što je učestalost tih simbola su unutar Huff datoteku. I onda napokon, imamo ček za frekvencije, koji bi trebao biti zbroj tih frekvencija. Dakle, to je ono što je Huffeader. Onda imamo neke funkcije koje vraćaju sljedećoj malo u Huff datoteku kao piše malo na Huff datoteku, a zatim je ova funkcija ovdje, hfclose, da zapravo zatvara Huff datoteku. Prije smo bili bave ravno samo fclose, ali kad imate Huff datoteku, umjesto da ga fclosing ono što ste zapravo će učiniti je hfclose i hfopen. Oni su specifične funkcije do Huff datoteka koje ćemo se baviti. Onda ovdje čitamo u zaglavlju, a zatim napisati zaglavlje. Samo čitajući. H datoteku možemo vrsta dobiti osjećaj za ono što Huff datoteka može biti, što obilježja ima, bez zapravo događa u huffile.c, koji, ako ćemo roniti u, što će biti malo složeniji. Ona ima sve datoteke I / O ovdje bavi pokazivače. Ovdje vidimo da kada mi zovemo hfread, na primjer, to je još uvijek bave fread. Mi ne uzimajući osloboditi od tih funkcija u potpunosti, ali šaljemo onima koji će se pobrinuti unutar Huff datoteku umjesto radiš sve to mi sami. Možete slobodno skenirati kroz to, ako vas zanima i otići i oguliti sloju leđa malo. Sljedeći sliku da ćemo pogledati je tree.h. Prije u Walkthrough klizi mi je rekao očekujemo Huffman čvor i napravili smo typedef struct čvor. Očekujemo da imaju simbol, frekvencija i onda dva čvora zvijezde. U tom slučaju ono što mi radimo je to u suštini isti osim umjesto čvora ćemo zvati ih stabala. Imamo funkciju da kada nazovete učiniti stablo se vraća vam stablo pokazivač. Povratak na Speller, kada su stvaranje novog čvora rekli ste čvor * nova riječ = malloc (sizeof) i slične stvari. Uglavnom, mktree će se baviti za vas. Slično tome, kada želite ukloniti stablo, tako da u suštini je oslobađajući stablo Kada završite s njim, umjesto izričito poziva besplatno na to, zapravo samo će koristiti funkciju rmtree gdje ste proći u pokazivač za tog stabla, a zatim tree.c će se pobrinuti da se za vas. Mi gledamo u tree.c. Očekujemo iste funkcije, osim da vidi provedbe, kao dobro. Kao što smo i očekivali, kada nazovete mktree to mallocs veličinu stabla u pokazivač, inicijalizira sve vrijednosti na null vrijednost, tako 0S ili ugašenih, , a zatim se vraća pokazivač na taj stabla koje ste upravo malloc'd za vas. Ovdje kada nazovete ukloniti stablo je prvi čini sigurni da ste ne dvostruko oslobađanju. To čini sigurni da ste zapravo imaju stablo koje želite ukloniti. Ovdje jer stablo također uključuje svoje djece, što to znači je to rekurzivno poziva ukloniti stablo na lijevoj čvor stabla kao i pravo čvora. Prije nego što se oslobađa roditelja, treba ga osloboditi djecu kao dobro. Roditelj je također zamjenjiva s korijenom. Prvi roditelj, pa kao pra-pra-pra-pra-pradjed ili baka stablo, prvo moramo osloboditi dolje razine prvi. Tako poprijeko na dno, bez one, a zatim se vratiti gore, bez onih, itd. Tako da je stablo. Sada ćemo pogledati šumi. Šuma je mjesto gdje ćete sve svoje Huffman stabala. To govori da ćemo imati nešto zove zemljište koji sadrži pokazivač na stablu, kao i upustvo na parceli zove sljedeći. Što struktura čini ovu vrstu izgledaju? To je vrsta to kaže tamo. Pravo ovamo. Povezani popis. Vidimo da kada imamo zemljište to je kao povezane popis parcela. Šuma je definirana kao povezane popis parcela, i tako je struktura šuma mi smo samo će imati pokazivač na naš prvi parceli i da zemljište ima stablo unutar nje, odnosno ukazuje na stablu , a zatim ukazuje na sljedeću parceli, tako dalje i tako dalje. Da bi šumu zovemo mkforest. Onda imamo neke prilično korisne funkcije ovdje. Imamo pokupiti gdje ste proći u šumi, a potom povratna vrijednost je stablo *, pokazivač na stablo. Što pick će učiniti je da će ići u šumu da ste pokazujući na zatim uklonite stablo s najnižom učestalosti od tog šumi i onda vam dati pokazivač tog stabla. Nakon što nazivamo pokupiti, drvo neće postojati u šumi više, ali povratna vrijednost je pokazivač na tom stablu. Tada imate biljku. Pod uvjetom da ste proći pokazivač na stablo koje ima ne-0 frekvenciju, što biljka će učiniti je da će se u šumu, uzeti stablo, a biljka koja stabla unutar šume. Ovdje imamo rmforest. Slično ukloniti stabla, koja u osnovi oslobođeni svih naših stabala za nas, uklanjanje šuma će besplatno sve sadržano u toj šumi. Ako ćemo gledati u forest.c, mi ćemo očekivati ​​da će vidjeti barem jednom rmtree naredbu tamo, jer radi oslobađanja memorije u šumi, ako šuma ima stabala u njemu, onda na kraju ćete morati ukloniti one stabala previše. Ako ćemo gledati u forest.c, imamo mkforest, koji je kao što smo očekivali. Mi malloc stvari. Mi inicijalizirati prvu radnju u šumi kao NULL, jer to je prazna za početak, onda ćemo vidjeti motika, koji vraća stablo uz najmanju težinu, što je najniža frekvencija, , a zatim dobiva osloboditi od tog čvora koji ukazuje na to stablo i pored jedne, tako da je potrebno da se od povezanog popisa šuma. I onda ovdje imamo biljka, koja se umeće stablo u povezane liste. Što šuma ne je to lijepo drži razvrstani za nas. I onda napokon, imamo rmforest i, kako se očekuje, imamo rmtree zove tamo. Gledajući na distribucijsku koda tako daleko, huffile.c je vjerojatno bio daleko najteže razumjeti, dok druge datoteke i sami bili prilično jednostavno slijediti. Uz naše znanje upućuje i povezanih listama i takvih, bili smo u mogućnosti pratiti prilično dobro. No, sve što je potrebno kako bi stvarno bili sigurni da ćemo u potpunosti razumjeti je. H slika jer vam je potrebno da se zove ta funkcija, koja se bavi tim povratnih vrijednosti, kako bi bili sigurni da ste u potpunosti razumjeli što akcija će biti izvedena kad god nazvati jedan od tih funkcija. Ali zapravo razumijevanje unutar nje nije sasvim neophodno jer imamo one. H datoteke. Imamo dva više datoteke preostale u našem distribucije koda. Pogledajmo deponij. Kiperi svojim komentarom ovdje ima Huffman sažetu datoteku a zatim prevodi i deponijama sve njezin sadržaj vani. Ovdje vidimo da je to zove hfopen. To je vrsta zrcaljenje podnijeti * Ulazni = fopen, i onda prođe u informacijama. To je gotovo identična, osim umjesto datoteke * ste prolazi u Huffile; umjesto fopen ste prolazi u hfopen. Ovdje možemo pročitati u zaglavlju prvi, što je vrsta slična kako čitamo u zaglavlju za bitmap datoteku. Ono što mi radimo ovdje je provjera kako bi vidjeli hoće li informacije u zaglavlju sadrži pravu čaroliju broj koji ukazuje da je stvarna Huff datoteka, onda sve ove provjere kako bi bili sigurni da je datoteka koje smo otvoreni je stvarna huffed datoteka ili ne. Što to znači je ona izlazi frekvencije svih simbola koje možemo vidjeti unutar terminala u grafičkom tablici. Ovaj dio će biti korisna. To je malo i čita malo po malo u varijablu malo, a zatim ga ispisuje. Dakle, ako sam bio na poziv deponij na hth.bin, što je rezultat huffing datoteku pomoću osoblja rješenje, ja bih se toga. To je outputting svih tih likova, a zatim stavljanjem frekvenciju na kojoj se pojavljuju. Ako gledamo, a većina njih su 0s osim za ovo: H, koja se pojavljuje dva puta, a zatim T, koja se pojavljuje nakon. I onda ovdje imamo stvarnu poruku 0s i 1s. Ako gledamo hth.txt, što je vjerojatno je izvorna poruka koje je huffed, očekujemo da će vidjeti neke HS i TS tamo. Naime, očekujemo kako bi vidjeli samo jedan T i dvije HS. Ovdje smo u hth.txt. To zaista ima HTH. Uključeno u tu, iako ne možemo vidjeti, je newline karakter. The hth.bin Huff datoteka također je kodiranje newline karakter kao dobro. Evo, jer znamo da bi je HTH i onda newline, možemo vidjeti da je vjerojatno H predstavlja samo jednu jednom a zatim T je vjerojatno 01 i zatim sljedeća H 1 kao i i onda imamo newline ukazuje na dvije 0S. Cool. I onda napokon, jer smo se bave više. St. i. H datoteke, idemo imaju prilično složene argument prevodilac, pa ovdje imamo makefile koji čini deponij za vas. Ali, zapravo, morate ići oko izrade vlastite puff.c datoteku. The Makefile zapravo ne bave izradu puff.c za vas. Odlazimo da do vas urediti Makefile. Kad unesete naredbu poput učiniti sve, na primjer, da će učiniti sve od njih za vas. Slobodno pogledate primjere makefile iz prošlosti pset kao i odlaze ovog jednog da vidite kako može biti u mogućnosti kako bi vaš lisnato datoteku uređivanjem ovaj makefile. To je otprilike to za naše distribucije koda. Nakon što smo dobili kroz to, onda ovdje je samo još jedan podsjetnik kako ćemo se baviti Huffman čvorova. Nećemo biti nazivajući ih čvorovi više, idemo se nazivajući ih stabala gdje idemo se predstavlja svoj simbol s char, njihova učestalost, broj pojava, s cijeli broj. Mi koristimo jer je to preciznije nego plutaju. I onda imamo još jedan pokazivač na lijevu djeteta, kao i pravo djeteta. Šuma, kao što smo vidjeli, samo je povezana popis stabala. U konačnici, kada smo izgradnju naše Huff datoteku, želimo naše šume da sadrži samo jedan stablo - 1 stablo, jedan korijen s više djece. Ranije kad smo bili samo što naše Huffman stabala, počeli smo se postavljanjem svih čvorova na našem zaslonu i rekao da ćemo imati ove čvorove, na kraju oni će biti lišće, a to je njihov simbol, to je njihova frekvencija. U našoj šumi, ako imamo samo tri slova, da je šuma 3 stabala. I onda kao što smo ići dalje, kada smo dodali prvi roditelja, smo napravili šumu dva stabla. Uklonili smo dvije od one djece iz naše šume, a zatim ga zamijeniti s matičnom čvoru koji je imao one dvije čvorova kao i djeca. I onda na kraju, naš zadnji korak u izradi naš primjer s AS, BS, i Cs bi donijeti konačnu roditelja, pa onda da će donijeti naš ukupan broj stabala u šumi na jedan. Da li su svi vidjeli kako ste započeli s više stabala u šumi i završiti s jednom? Ok. Cool. Što trebamo učiniti za lisnato? Ono što trebate učiniti je osigurati da, kao i uvijek, daju nam pravu vrstu ulaza tako da zapravo možemo pokrenuti program. U tom slučaju oni će biti dajući nam nakon svog prvog naredbenog retka argument 2 više: datoteka koja želimo smanjivati, a izlaz otpakirati datoteke. No, kad smo bili sigurni da nam prođe u pravom iznosu od vrijednosti, želimo osigurati da je ulaz Huff datoteka ili ne. I onda odjednom jamčimo da je Huff datoteku, onda želimo graditi našu stablo, izgraditi stablo takav da odgovara stablo da osoba koja je poslala poruku izgrađen. Onda nakon što smo izgraditi stablo, onda možemo nositi s 0s i 1s da su prošli u, slijediti one uz našu stabla jer je identičan, i onda napisati tu poruku van, tumačiti bitova natrag u znakovi. I onda na kraju, jer smo se bave pokazivače ovdje, želimo biti sigurni da mi nemamo nikakve memory leaks i da smo slobodni sve. Osiguranje pravilno korištenje je stari šešir za nas do sada. Mi se u ulazu, koji će biti ime datoteke napuhati, i onda smo naveli izlaz, tako da je ime datoteke za napuhan izlaz, koji će biti tekstualna datoteka. To je običaj. A sada želimo osigurati da je ulaz huffed ili ne. Razmišljajući unatrag, je li nešto u distribuciji koda koji bi nam moglo pomoći s razumijevanjem da li je datoteka huffed ili ne? Došlo je do informacije u huffile.c o Huffeader. Znamo da je svaki Huff datoteka ima Huffeader povezane s njom s čarobnim brojem kao niz frekvencija za svaki simbol kao i checksum. Znamo da, ali mi smo također uzeo zaviriti u dump.c, u kojoj je čitao u Huff datoteku. I tako to učiniti, morao je provjeriti je li to stvarno bila huffed ili ne. Pa možda bismo mogli koristiti dump.c kao strukture za naše puff.c. Povratak na pset 4 kada smo imali datoteke copy.c da kopira u RGB trojke i mi tumači da je za detektivski roman i veličinu, slično, što bi mogao učiniti samo pokrenuti naredbu kao k.č. dump.c puff.c i koristiti neke od zakonika. Međutim, to ne će biti kao jednostavan procesa za prevođenje svoj dump.c u puff.c, ali barem vam daje negdje početi o tome kako bi se osiguralo da je ulaz zapravo huffed ili ne kao i nekoliko drugih stvari. Osigurali smo pravilno korištenje i osigurao da je ulaz huffed. Svaki put da smo učinili što smo učinili našu pravilnu provjera, tako povratka i odvikavanje funkciju ako neke pogreške, ako postoji problem. Sada ono što želimo učiniti je izgraditi stvarni stablo. Ako ćemo gledati u šumi, tu su i dvije glavne funkcije da ćemo želite postati vrlo dobro poznaju. Tu je Booleova funkcija biljka koja biljke ne 0 frekvencija stabala unutar naše šume. I tako postoji li proći u pokazivač na šumu i pokazivač na stablo. Brzo pitanje: Koliko šume ćete imati kad ste izgradnji Huffman stablo? Naša šuma je kao naš platnu, zar ne? Tako smo samo ćeš imati jedan šumu, ali ćemo imati više stabala. Dakle, prije nego nazovete biljku vjerojatno idete da želite da vaš šumu. Tu je naredba za to ako pogledate u forest.h o tome kako možete napraviti šumu. Možete posaditi drvo. Mi znamo kako to učiniti. A onda možete odabrati stablo iz šume, uklanjanja stabla s najmanjom težinom i daje vam pokazivač na to. Osvrčući se kad smo radili na primjerima sebe, kada smo ga izvlači, mi jednostavno samo dodao linkove. Ali ovdje, umjesto samo dodao linkove, mislim da je to više kao da ste uklanjanjem dvije od tih čvorova, a zatim ga zamijeniti još jedan. Za izraziti da je u pitanju branje i sadnja, ste branje dva stabla, a zatim sadnju još stablo da ima one dvije stabala koje ste odabrali kao djeca. Za izgradnju Huffman je stablo, možete pročitati u simbolima i frekvencija u cilju jer Huffeader daje da bi vas, daje vam niz frekvencija. Dakle, možete ići naprijed i jednostavno ignorirati sve s 0 u njemu jer ne želimo 256 lišća na kraju njega. Mi samo želimo broj listova koji su likovi koji su zapravo koristi u datoteci. Možete pročitati u tim simbolima, a svaki od tih simbola koji imaju non-0 frekvencije, oni će biti stabla. Što možete učiniti je svaki put kad pročitate u non-0 frekvencije simbol, možete posaditi da stabla u šumi. Nakon što se biljka stabala u šumi, možete se pridružiti te stabla kao braća i sestre, pa ide natrag u sadnju i branje gdje pokupiti dvije, a zatim biljka 1, gdje je taj jedan da ti biljka je roditelj dvoje djece od koje beru. Pa onda tvoj krajnji rezultat će biti nijedno stablo u šumi. To je kako ste izgraditi stablo. Postoji nekoliko stvari koje bi mogle poći po zlu ovdje jer smo se bave s izradom novih stabala, a koje se bave upućuje i tome slično. Prije kad smo se bave pokazivače, kad smo malloc'd smo željeli biti sigurni da se ne vrati nam null pointer vrijednost. Dakle, na nekoliko koraka unutar tog procesa tamo će biti nekoliko slučajeva gdje je vaš program mogao uspjeti. Što želite učiniti je da želite da biste bili sigurni da ste radili te pogreške, au spec. piše da ih nositi dostojanstveno, tako bih ispisati poruku korisniku reći im zašto program mora prestati i onda odmah to prestati. Da biste to učinili rukovanje pogreškama, sjetite se da ga želite provjeriti svaki put da bi moglo biti neuspjeh. Svaki put da ste stvaranje novog pokazivač želite da biste bili sigurni da je to uspješan. Prije što smo učiniti je novi pokazivač i malloc ga, a onda bismo provjerili da li da pokazivač je NULL. Dakle, tu su idući u biti neki slučajevi gdje možete samo to učiniti, ali ponekad ste zapravo zove funkciju i unutar te funkcije, to je onaj koji je radi mallocing. U tom slučaju, ako se osvrnemo na neke od funkcija u kodu, neki od njih su Booleove funkcije. U apstraktnom slučaju ako imamo Booleova funkcija zove foo, u osnovi, možemo pretpostaviti da osim što god foo radi, budući da je Booleova funkcija, vraća true ili false - istina ako je uspješna, false ako nije. Dakle, želimo provjeriti je li povratak vrijednost foo je istinita ili lažna. Ako je lažna, to znači da ćemo ispisati nekakvu poruku a zatim zatvorite program. Ono što želimo učiniti je provjeriti povratnu vrijednost foo. Ako foo false, onda znamo da smo naišli neku vrstu pogreške i trebamo prestati naš program. Način da to učinite je imati stanje u kojem je stvarna funkcija sama po sebi je vaše stanje. Recimo foo uzima u x. Mi možemo imati kao uvjet if (foo (x)). Uglavnom, to znači da ako na kraju izvršenja foo to true onda možemo to učiniti, jer je funkcija mora ocijeniti foo kako bi se procijenio cijeli stanje. Dakle to je kako možete učiniti nešto ako funkcija vraća istinita i je uspješna. No, kada ste pogreška provjere, samo želite prestati ako vaš funkcija vraća false. Što mogu učiniti samo dodati == false ili samo dodati prasak ispred njega i onda imate ako (! foo). U tom tijelu takvom stanju da bi sve pogreške rukovanja, tako sviđa, "ne mogu stvoriti ovo drvo", a zatim se vratiti jednog ili nešto slično. Što da ne, ipak, da iako foo vratio lažna - Recimo foo true. Onda nemate nazvati foo opet. To je uobičajena zabluda. Budući da je u svom zdravstvenom stanju, to je već ocijenjen, pa već imate rezultat, ako ste koristeći napraviti stablo ili nešto slično ili biljka ili pokupiti ili nešto. To već ima tu vrijednost. To je već izvršena. Dakle, to je korisno koristiti Boolean funkcije kao uvjet jer da li ili ne zapravo izvršiti tijelo petlje, izvršava funkciju ionako. Naš drugi na zadnji korak je pisanje poruke u datoteku. Nakon što smo izgraditi Huffman stablo, zatim pisanja poruke u datoteku je prilično jednostavan. To je prilično jednostavan sada samo slijediti 0S i 1S. I tako po konvenciji znamo da u Huffman stablo 0s ukazuju na lijevo i 1s pokazuju pravu. Dakle, ako ste pročitali u malo po malo, svaki put da ste dobili 0 ćete slijediti lijevu granu, a onda svaki put kad pročitate u jednom ćeš slijediti pravu granu. A onda ćeš nastaviti sve dok ne pogoditi list jer su listovi će biti na kraju grane. Kako možemo reći da li smo hit list ili ne? Mi to rekao prije. [Student] Ako pokazivači su NULL. >> Da. Možemo reći ako smo pogodak list ako upućuje na obje lijeve i desne stabala NULL. Savršeno. Znamo da želimo pročitati u malo po malo u naš Huff datoteku. Kao što smo vidjeli prije u dump.c, ono što su učinili oni pročitati u malo po malo u Huff datoteku i samo ispisati ono što ti bitovi bili. Nećemo se radi. Idemo da se radi nešto što je malo složeniji. No, ono što možemo učiniti je da možemo uzeti da je malo koda koji glasi na na malo. Ovdje imamo cijeli zalogaj predstavlja trenutno malo da smo na. Ovo brine Ponavljanje svih bitova u datoteci dok ne pogoditi kraj datoteke. Na temelju toga, onda ćeš htjeti imati nekakav iteratora proći svoje stablo. I onda na temelju li malo je 0 ili 1, idete da želite ili premjestiti taj iteratora na lijevoj ili ga premjestiti na desno sve dok ne pogoditi list, pa sve do tog čvora koji ste na ne ukazuju na bilo više čvorova. Zašto možemo to učiniti s Huffman datoteku, ali ne Morse koda? Jer u Morse kodu postoji malo dvosmislenosti. Mogli bi biti kao što je, oh čekati, mi smo hit pismo na putu, pa možda je to naš pismo, a ako smo nastavili samo malo duže, onda bismo pogodio jedno pismo. No, to se neće dogoditi u Huffman encoding, tako da možemo biti sigurni da je jedini način da ćemo pogoditi karakter je li te čvora lijevo i desno su djeca NULL. Konačno, želimo osloboditi sve naše pamćenje. Želimo i zatvoriti Huff datoteka koje smo bave kao i uklanjanje svih stabala u našoj šumi. Na temelju vašeg provedbi, vjerojatno idete da želite nazvati uklanjanje šuma umjesto zapravo prolazi kroz sve stabala sebe. Ali, ako ste napravili bilo kakve privremene stabala, da ćete želite osloboditi toga. Znate svoj kôd najbolje, tako da znate gdje ste dodjele memorije. I tako, ako idete u, početi čak i kontrolu F'ing za malloc, vidim kad god malloc i pazeći da oslobodi sve koji ali onda samo prolazi kroz kodu, razumijevanje gdje ste možda dodjeljuje memoriju. Obično se samo može reći: "Na kraju datoteku Samo ću ukloniti šumu na mom šumi" tako da u osnovi jasno da sjećanje, bez da "I onda ja idem zatvoriti datoteku, a zatim moj program će se zatvoriti." No, je li to jedini put da je vaš program zatvara? Ne, jer ponekad možda bio pogreška što se dogodilo. Možda nismo mogli otvoriti datoteku ili nismo mogli napraviti još jedan stablo ili neka vrsta pogreške se dogodilo u procesu dodjela memorije i tako se vratio NULL. Pogreška se dogodilo, a onda smo se vratili i prestati. Dakle želite biti sigurni da bilo moguće vrijeme da vaš program može zatvoriti, Želite li osloboditi sve svoje memorije tamo. To nije samo će biti na samom kraju glavne funkcije koju prestati svoj kôd. Želite li pogledati natrag u svakom slučaju da je vaš broj potencijalno može vratiti prijevremeno i onda bez obzira memorije smisla. Recimo da je pozvao da šumu i da se vratio lažna. Onda ti vjerojatno neće trebati ukloniti šumu jer nemate šumu još. No, u svakom trenutku u kodu gdje se može vratiti prijevremeno želite da biste bili sigurni da ćete osloboditi eventualne memorije. Dakle, kada imamo posla s oslobađanjem memorije i imaju potencijalne curenja, želimo ne samo koristiti naše presudu i našu logiku ali također koristiti Valgrind kako bi se utvrdilo da li smo oslobođeni svih naših memorije ispravno ili ne. Možete pokrenuti Valgrind na lisnato i onda morate također ga proći Pravo broj naredbenog retka argumente za Valgrind. Možete pokrenuti, ali izlaz je malo zagonetan. Dobili smo malo koristi za njega Speller, ali mi još uvijek treba malo više pomoći, pa onda to radi s još nekoliko zastava poput curenja provjerite = puni, da vjerojatno će nam dati neke više korisnih izlaz na Valgrind. Zatim još jedan koristan savjet kad ste debugging je razl naredbu. Možete pristupiti osoblja provedbu Huff, pokrenuti da na tekstualnu datoteku, , a zatim ga reproducirati na binarnu datoteku, binarna datoteka Huff, biti specifičan. Onda ako pokrenuti vlastiti napuhati na taj binarnu datoteku, onda je idealno, vaš outputted tekstualna datoteka će biti identičan na prvobitni koju je donio u. Evo ja sam koristeći hth.txt kao primjer, a to je jedan govorio o vašem spec.. To je doslovno samo HTH i onda newline. Ali definitivno slobodno i sigurno se potiče da koriste duže primjere za tekstualnoj datoteci. Možete čak i uzeti pucao na možda sažimanje i onda decompressing neke od datoteka koje se koriste u Speller poput rata i mira ili Jane Austen ili nešto slično - da bi se vrsta cool - ili Austin Powers, vrste koje se bave većim datotekama, jer mi ne bi došli do njega ako smo koristili sljedeću alat ovdje, ls-l. Mi smo navikli na LS, koji je u osnovi navodi sve sadržaje u našoj trenutnoj imenik. Dodavanje u zastave-l zapravo prikazuje veličinu tih datoteka. Ako idete kroz pset spec., to je zapravo vodi vas kroz stvaranje binarnu datoteku, da ga huffing, i vidjet ćete da za vrlo male datoteke Prostor trošak ga sažimanje i prevodio sve te informacije od svih frekvencija i stvari kao što je to nadilazi stvarni korist sažimanje datoteke na prvom mjestu. Ali ako ga pokrenuti na nekim duže tekstualne datoteke, onda ste mogli vidjeti da počnete da biste dobili neke koristi u sažimanje te datoteke. I onda na kraju, mi imamo stari pajdaš gdb, koji definitivno će doći u ruci previše. Imamo li kakvih pitanja o Huff stabala ili proces možda izrade stabla ili sva ostala pitanja na Huff'n lisnato? Ok. Ja ću ostati oko za malo. Hvala, svima. To je bio Walkthrough šest. I sretno. [CS50.TV]