[Powered by Google Translate] [Gözden geçirmek - Problem Set 6] [Zamyla Chan - Harvard Universiteti] [Bu CS50 edir. - CS50.TV] Salam, hər kəs və gözden geçirmek 6 xoş gəlmisiniz: Huff'n Puff. Huff'n Puff biz nə bir Huffman sıkıştırılmış fayl ilə məşğul olacaq və sonra geri o şişirme belə decompressing biz 0s və 1s istifadəçi bizə göndərir ki, tərcümə edə bilərsiniz, belə ki, və orijinal mətn daxil geri çevirmək. Siz tools bəzi görmək olacaq çünki Pset 6 olduqca sərin olacaq siz 1 olduqca səliqəli anlayışı onları birləşdirən pset 4 və pset 5 və cür istifadə Bu barədə düşünmək gələndə. Həmçinin, arguably, pset 4 və 5 təklif etdi ki, ən çətin psets idi. Beləliklə, biz, C, bu 1 daha pset var və sonra sonra biz web proqramlaşdırma üçün edirik. Belə ki, CS50 də çətin donqar üzərində almaq üçün özünüzü təbrik edirəm. Huff'n Puff üçün hərəkət, bu pset üçün Toolbox, Huffman ağacları olacaq belə binar ağac iş, həm də xüsusi Huffman ağacı yalnız necə başa necə inşa edirik. Və sonra biz bu pset paylanması kodu bir çox olacaq və biz kodu bəzi həqiqətən görmək gəlmək lazımdır biz hələ tam dərk edə bilər və həmin onların müşayiət. h faylları. c faylları, lakin edəcək Bizi biz bu funksiyaları necə bilirik ki, lazımdır ki, kifayət qədər anlayış verəcək və ya ən azı nə onlar ehtimal olunur - onların giriş və çıxış - biz qara qutusuna nə bilmirəm, hətta ərzində və ya qara qutu nə baş başa düşmürəm. Və sonra nəhayət, adi kimi, biz yeni data strukturları ilə məşğul olan ki qovşaqlarının xüsusi növləri müəyyən şeylər qeyd və belə ki, burada dizayn prosesi üçün təkcə qələm və kağız olan və zaman pset iş necə anlamaq çalışdığınız həm də ayıklama zamanı. Siz dəyərlər nə yazmaq isə Siz qələm və kağız yanaşı gdb ola bilər harada oxlar işarə edərək, və elə şeylər edir. Birinci Huffman ağacları baxaq. Huffman ağac hər node yalnız 2 övladı var, yəni, ikili ağacları daxildir. Huffman ağacları xarakterik olan ən tez-tez dəyərlər ən az bit ilə təmsil olunur. Biz Morse kodu mühazirə nümunələri icmal hansı cür bir məktub gördü. Məsələn, A və ya E, tərcümə çalışdığınız Əgər Əgər tez-tez tərcümə edirik, belə əvəzinə bit tam set istifadə edərək ki, adi data növü üçün ayrılmış, siz daha az üçün aşağı kompres və sonra təmsil edən məktublar az tez-tez artıq bit ilə təmsil olunur bu məktublar görünür ki, tezliklərin həyata çəkin zaman ki, ödəyə bilər. Biz Huffman ağacları burada eyni fikir biz bir zəncir, müəyyən simvol almaq üçün yol bir növ edir. Və sonra ən tezliyi olan simvol ən az bit ilə təmsil olunur. Bir Huffman ağac tikmək yolu mətn görünür ki, simvol bütün yerləşdirilməsi ilə və onların tezliyi hesablanması, necə tez-tez görünür. Bu, ya o məktublar görünür neçə dəfə bir sayı ola bilər və ya bəlkə hər bir əmələ nə qədər bütün simvol həyata faizi. Və nə siz, bir dəfə ki, eşlenen həyata bütün var sonra 2 aşağı tezliklərin axtarmaq və sonra bacı kimi onlara qoşulmaq daha sonra ana node onun 2 övladı məbləğin olan tezlik var. Və sonra siz Konvensiya tərəfindən demək ki sol node, Siz 0 filial aşağıdakı tabe və sonra rightmost node 1 qoludur. Biz Morse kodu gördüm kimi, bir gotcha idi ki, yalnız bir beep və beep olsaydı bu birmənalı idi. Bu da 1 məktub ola bilər və ya 2 məktubları bir sequence ola bilər. Və nə Huffman ağac yoxdur ki, simvol təbiəti çünki və ya bizim son faktiki simvol şöbəsində son qovşaqlarının olan - biz yarpaqları həmin baxın - ki, əsasən hər hansı bir qeyri ola bilməz siz bit seriyası ilə kodlar çalışdığınız olan məktub baxımından çünki 1 məktub təmsil edən bit boyunca heç bir yerdə Başqa bir bütöv məktub qarşılaşacaq və hər hansı bir qarışıqlıq olmayacaq. Amma siz uşaqlar həqiqətən görürük ki nümunələri daxil lazımdır ki, əvəzinə bizə yalnız doğru belirten. Üzrə Huffman ağac sadə bir misal baxaq. Mən 12 simvol uzunluğunda ki, burada bir simli var. Mən 6 pansiyonlar, 2 Cs kimi 4 var. Mənim ilk addım saymaq olardı. A neçə dəfə görünür? Bu simli 4 dəfə görünür. B 6 dəfə görünür, və C 2 dəfə görünür. Təbii ki, mən ən çox B kullanıyorum demək gedirəm Mən bit və az sayı 0s və 1s və az sayı ilə B təmsil etmək istəyirəm. Və sonra da C həmçinin 0s və 1s ən məbləğ tələb gözləmək gedirəm. Birinci mən burada nə mən tezliyi baxımından üçün artan onlara yerləşdirilir. Biz C və A, bu bizim 2 aşağı tezliklərin ki, görürük. Biz bir valideyn node yaratmaq və valideyn node Bugün məktub yoxdur lakin bu məbləğ bir tezlik, yoxdur. Cəmi 6 olan 2 + 4 olur. Sonra sol qolu edin. Biz 6 node idi, onda biz C almaq üçün 0 edin ki, və sonra 1 A. almaq Belə ki, indi biz 2 qovşaqlarının var. Biz dəyəri 6 və sonra da dəyəri 6 başqa bir node var. Və həmin 2 ən aşağı 2, həm də sol yalnız 2 deyil, yalnız biz cəmi 12 olmaqla, başqa valideyn həmin buyurun. Belə ki, burada biz Huffman ağac var B almaq üçün harada, yalnız az 1 olacaq və sonra A almaq üçün biz C 00 olan sonra 01 və olacaq. Belə ki, burada biz əsasən biz 1 və ya 2 bit ya bu chars təmsil etdiyiniz bax Ü kimi proqnozlaşdırılmış B,, az var. Və sonra, biz C ən olması gözlənilir, lakin belə bir kiçik Huffman ağac olduğundan sonra bir də ortasında yerə qarşı 2 bit təmsil olunur. Yalnız Huffman ağac bir sadə misal üzərində getmək üçün Siz simli var demək "Hello". Nə siz neçə dəfə H bu görünür deyərdim ilk? H dəfə və sonra e görünür görünür bir dəfə və daha sonra iki dəfə görünen l var və o bir dəfə görünmesi. Və sonra biz bit ən az təmsil edən məktubu gözləyirik? [Tələbə] l. >> L. Bəli. l hüququdur. Biz l bit ən az təmsil gözləyirik çünki l "Hello". simli ən istifadə olunur Mən indi gedirəm nə bu qovşaqlarının çıxartmaq olunur. Mən o olan e olan digər 1, sonra 1, H olan, 1 var, - l olan, sonra 2 - İndi onları qoyulması alıram. Sonra mən Huffman ağac qurmaq yolu ən tezliklərin ilə 2 qovşaqlarının tapmaq demək və valideyn node yaratmaqla onları bacı edir. Burada ən aşağı tezlikli 3 qovşaqlarının var. Onlar 1 istəyirik. Belə ki, burada biz ilk keçid olacaq bir seçin. Gəlin mən H və E seçmək deyirlər. 1 məbləği + 1 2 deyil, bu node Bugün məktub mövcut deyil. Bu, yalnız dəyəri vardır. İndi biz növbəti 2 aşağı tezliklərin oldu. Ki, 2 və 1 var. Bu da o 2 ola bilər, amma bu bir seçmək üçün gedirəm. Cəmi 3. Və sonra nəhayət, mən yalnız sonra 5 olur ki, 2 sol var. Mən bunun üçün kodlama doldurmaq Əgər burada kimi gözlənilir 1s həmişə düzgün filialı və 0s sol bir olunur. Sonra 2-yalnız 1 bit və sonra o təmsil l var və sonra 2-e, sonra H 3 bit aşağı düşür. Belə ki, "Hello" Bu mesaj ötürmək bilər əvəzinə faktiki Sandıqı istifadə edərək, yalnız 0s və 1s tərəfindən. Lakin, bir neçə hallarda biz tezliyi ilə əlaqələri olduğunu unutmayın. Biz ya bəlkə ilk H və o qoşulmuşdur bilər. Yoxsa sonra biz 2 təmsil l zaman haqqında həmçinin 2 təmsil bir qoşulub, biz bir bağlı ola bilər. Və siz göndərmək zaman 0s və 1s, həqiqətən, zəmanət deyil Alıcı tam hüququ yarasa off oxumaq bilər ki, onlar edən qərar bilmirəm bilər, çünki. Beləliklə, biz Huffman sıxılma ilə məşğul olduğunuz zaman, birtəhər biz qərara necə bizim mesaj alan demək var - Onlar əlavə məlumat bir növ bilmək lazımdır sıxılmış mesaj əlavə. Onlar ağac həqiqətən kimi görünür nə başa düşmək lazımdır biz, həqiqətən, bu qərarlar qəbul necə. Burada biz yalnız faktiki sayı əsasında nümunələri edirdilər amma bəzən də bir Huffman ağac ola bilər tezlik əsasında hərfləri görünür, bu eyni proses var olan. Burada, faiz və ya bir qismini baxımından bu ifadə edirəm və belə ki, burada eyni şey. I, 2-aşağı, onları vurmaq, aşağı növbəti 2, onlara yekun tapmaq Mən tam ağac qədər. Biz biz faiz ilə məşğul olduğunuz zaman ya yol, nə ola bilər baxmayaraq, biz şeyi ayırıcı və ondalık ilə məşğul olduğunuz deməkdir və ya daha çox üzüb gedirdi ki, biz bir baş data strukturları düşünərək edirsinizsə. Biz üzüb gedirdi haqqında nə bilirik? Biz üzüb gedirdi ilə məşğul olduğunuz zaman ortaq problem nədir? [Tələbə] qeyri-dəqiq hesab. >> Bəli. Qeyri-dəqiqlik. Çünki üzən qeyri-dəqiqlik, bu pset biz əmin olun ki, biz heç bir dəyərləri itirmək deyil ki, biz, həqiqətən, sayı ilə məşğul olmaq üçün olacaq. Siz burada quruluşuna geri baxmaq əgər, bir Huffman node hesab idi əgər siz yaşıl isə baxmaq əgər Bugün tezlik var habelə onun sol bir node habelə hüququ bir node göstərir. Və sonra qırmızı olanlar orada da onlara bağlı bir xarakter daşıyır. Biz valideynlər və sonra yekun qovşaqlarının üçün ayrı-ayrı olanları etmək fikrində deyilik olan biz yarpaqları kimi istinad deyil, o yalnız NULL dəyərlər var. Hər node üçün biz bir xarakter ki, node təmsil simvolu olacaq sonra tezlik habelə onun sol uşaq, eləcə də sağ uşaq bir göstərici. Çox altında olan yarpaq, həmçinin node göstəricilərinə olacaq onların sol və sağ, lakin o dəyərləri faktiki qovşaqlarının işarə deyil, çünki onların dəyəri nə olardı? >> [Tələbə] NULL. >> NULL. Exactly. Burada üzüb gedirdi olan tezlik təmsil bilər necə bir misal var amma biz integers ilə məşğul olmaq üçün olacaq belə etdim bütün orada data type dəyişdirmək deyil. Üzrə kompleks Məsələn bir az daha davam edək. Amma indi biz sadə olanları etdik ki, yalnız eyni proses var. Siz 2 aşağı tezliklərin tapmaq tezliklərin yekun və ki, sizin ana node yeni tezlik var daha sonra 1-filialı ilə 0 filialı və sağ ilə sol göstərir. Biz string "Bu cs50 ki," var, onda biz, T qeyd neçə dəfə saymaq h qeyd i, s, c, 5, 0. Sonra nə mən burada idi, mən yalnız əkilmiş qırmızı qovşaqlarının ilə Mən ağac altında nəticədə bu simvol var gedirəm deyib. Bu yarpaqları bütün olacaq. Sonra nə etdim, mən sifariş artan tezlik onlara sıralanır edir və bu əslində pset kodu yoxdur ki, yolu bu tezlik ilə növ bu və sonra əlifba sırası edir. Belə ki, tezlik ilə əlifba sırası ilə ilk və sonra nömrələri var. Sonra nə edəcəyini mən 2 aşağı tapmaq edir. Bu 0 və 5 var. Mən onları yekunlaşdırmaq olardı ki, 2 deyil. Sonra növbəti 2 aşağı tapmaq, davam edir. Bu iki 1s və həmin həmçinin 2 çevrilmişdir. İndi növbəti addım, ən aşağı sayı qoşulması olacaq bilirik ki, olan, 1-T, sonra tezlik 2 ki qovşaqlarının birini seçmək. Belə ki, burada biz 3 variantları var. Mən slayd üçün nə etmək gidiyorum nə yalnız vizual sizin üçün yeniden edir belə ki, mən bu qədər tikinti oldum necə görə bilərsiniz. Kodu və bölüşdürülməsi kodu edəcəyimiz nə T bir qoşulmaq olar 0 və 5 node ilə. Belə ki, daha sonra 3 məbləğləri və biz prosesi davam edir. 2 və 2 indi sonra, 4 bu məbləğ ən aşağı edir. Hər kəs bu günə qədər sonra? Okay. Sonra bundan sonra, 3 və əlavə etmək lazımdır ki, 3 mövcut siz çox messy almaq deyil ki, vizual belə görürük ki, belə daha yalnız keçid alıram. Biz yalnız 2 qovşaqlarının ki, sonra biz 6, və sonra bizim son addım indi 10 olan ağac kökü etmək o edib. Hər node təmsil çünki sayı 10, hissi verir onların dəyəri, onların tezliyi, sayı, onlar simli çıxdı neçə dəfə və sonra biz simli 5 simvol var, hissi verir ki,. Biz həqiqətən kodlar necə qədər baxsaq, gözlənilən kimi, i və ən tez-tez görünür olan s, bit və az sayda təmsil olunurlar. Burada diqqətli olun. Huffman ağacları işin faktiki məsələləri. Bir böyük S kiçik s çox fərqlidir. Biz idi varsa, kiçik s yalnız iki dəfə görünür sonra, kapital hərflərlə "Bu CS50 deyil" onun dəyəri 2 ilə node olacaq, sonra böyük S yalnız bir dəfə olacaq. Həqiqətən burada əlavə yarpaq, çünki Belə ki, sonra ağac strukturları dəyişdirmək olar. Amma məbləğ hələ 10 olardı. Yəni biz əslində checksum zəng etmək olacaq nə bu sayar bütün əlavə. İndi Huffman ağacları əhatə etdik ki, biz Huff'n Puff ki, pset daxil dive bilər. Biz, suallar bölməsi ilə başlamaq olacaq və bu ikili ağac və necə ki, ətrafında fəaliyyət ilə vərdiş əldə edir: rəsm qovşaqlarının, bir node üçün öz typedef struct yaradılması, və bir ikili ağac, sorted ki, bir daxil ola bilər necə görən, o ki, kimi şeylər traversing. Bu bilik mütləq Huff'n Puff hissəsi daxil zaman dive sizə kömək edir bu pset edir. Bu pset səviyyəsinin nəşr, sizin vəzifəsi Puff həyata keçirmək və hacker versiyası Task Huff həyata keçirilməsidir. Huff edir nə, bu mətn edir və onda 0s və 1s onu çevirir biz tezliklərin sayılır biz yuxarıda ki prosesi və sonra ağac və sonra dedi: "Mən T alıram?" T 100 ilə təmsil olunur ki, kimi şeylər, və sonra Huff mətn və sonra çıxış edən ikili edəcək. Lakin biz mesaj bizim alan imkan istəyirəm bilirik ki, çünki eyni ağac yeniden, bu da tezliyi sayıları haqqında məlumat daxildir. Sonra Puff biz 0s və 1s bir ikili fayl verilir və həmçinin tezliklərin haqqında məlumat verilir. Biz ki, orijinal mesajı o 0s və 1s geri bütün tərcümə belə ki decompressing edirik. Siz standart nəşr edirik, siz, Huff həyata ehtiyac yoxdur belə sonra yalnız Huff heyəti həyata istifadə edə bilərsiniz. Bunu necə spec ildə təlimat var. Siz müəyyən bir mətn faylı ilə Huff heyəti həyata çalıştırabilirsiniz və sonra yastıq üçün giriş kimi çıxış istifadə edin. Mən əvvəl qeyd etdiyim kimi, biz bu bir distribution kodu var. Mən bunu keçir başlamaq üçün gedirəm. Mən də çox vaxt sərf etmək niyyətindədir edirəm. H faylları biz. h var çünki. c faylları, çünki və ki, funksiyaları prototipləri bizi təmin edir tam dəqiq anlamaq üçün ehtiyac yoxdur - Siz. C faylları neler başa düşmürəm, onda çox narahat olmayın bəzi göstərişlər vermək bilər, çünki mütləq bir nəzər cəhd və digər insanların kodu oxu üçün istifadə almaq üçün yararlıdır. Huffile.h baxanda şərh bu Huffman kodlu faylları üçün abstraksiya bir qat bəyan edir. Biz aşağı getmək varsa, biz kodları lazımdır ki, 256 simvol maksimum olduğunu görürük. Böyük və kiçik - - Bu əlifba bütün məktubları daxildir və sonra simvol və nömrələri, və s. Sonra burada bir Huffman kodlu fayl müəyyən bir sehrli var. Bir Huffman kodu çərçivəsində onlar müəyyən bir sehrli sıra olacaq mövzu ilə bağlı. Bu, yalnız bir təsadüfi sehrli sayı kimi ola bilər həqiqətən ASCII onu tərcümə olsa, o, həqiqətən HUFF həyata spells. Burada biz bir Huffman-kodlanmış fayl üçün struct var. Bir Huff fayl ilə bağlı bu xüsusiyyətlər bütün var. Sonra aşağı burada bir Huff fayl üçün başlıq var, belə ki, biz bu Huffeader zəng əvəzinə hər halda eyni səslənir, çünki əlavə h durub. Cute. Biz bununla bağlı bir sehrli var. Bir faktiki Huff fayl varsa, o qədər yuxarıda bu sehrli bir sıra olacaq. Və sonra bir sıra olacaq. Belə ki, hər bir simvolu üçün olan 256, var bu simvol tezliyi də Huff fayl ərzində nə siyahısını olacaq. Və sonra nəhayət, biz tezliklərin üçün checksum var olan tezliklərin məbləğ olmalıdır. Belə ki, nə bir Huffeader edir. Sonra Huff fayl növbəti bit qayıtmaq ki, bəzi funksiyaları vardır habelə hfclose, burada bu funksiya, sonra Huff fayl bir az yazır, ki, əslində Huff fayl bağlayır. Əvvəl, biz düz yalnız fclose ilə məşğul idi ancaq bir Huff fayl zaman əvəzinə fclosing haqqında nə həqiqətən nə olacaq hfclose və hfopen edir. Bu biz ilə məşğul olacaq olduğunuz Huff faylları xüsusi funksiyaları. Sonra burada mövzu oxumaq və sonra mövzu yazın. Yalnız. H fayl oxuyaraq biz bir Huff fayl ola bilər nə bir mənada almaq cür bilərsiniz bu, əslində huffile.c daxil davam olmadan, nə xüsusiyyətləri ki, biz dalış, əgər bir az daha kompleks olacaq. Bu I / O burada göstəricilər ilə məşğul olan fayl bütün var. Burada biz hfread zəng zaman, məsələn, hələ fread ilə məşğul ki, görürük. Biz tamamilə həmin funksiyaları kurtulmanın deyilik, amma biz qayğı bu gönderiyorsanız əvəzinə özümüzü bütün etmənin Huff fayl daxilində. Siz maraqlı olduğunuz halda bu vasitəsilə scan pulsuz hiss edə bilərsiniz və getmək və geri qat bir az qabığı. Biz baxmaq olacaq ki, növbəti fayl tree.h. edir Bu gözden geçirmek slaydlar əvvəl biz Huffman node gözlədiklərini söylədi və biz typedef struct node etdi. Biz simvolu tezlik, sonra 2 node ulduz gözləmir. Bu halda biz nə edirik bu mahiyyətcə eyni edir əvəzinə node başqa biz onlara ağac zəng olacaq. Biz sizə ağac etmək zəng zaman bir ağac göstərici qaytarır bir funksiyası var. Yeni bir node edilməsi zaman Speller geri dediniz node * yeni söz = malloc (sizeof) və bu kimi şeylər. Əsasən, mktree sizin üçün ki, ilə məşğul olacaq. Eynilə, bir ağac aradan qaldırılması üçün istədiyiniz zaman, ki, mahiyyətcə, bu ilə bittiğinde ağac azad edir əvəzinə aydın ki, pulsuz zəng, həqiqətən, yalnız rmtree funksiyasını istifadə etmək olacaq Əgər ki, ağac üçün pointer keçmək və harada tree.c sizin üçün ki, qayğı olacaq. Biz tree.c. baxmaq Biz həyata görmək istisna olmaqla, eyni funksiyaları gözləyirik. Biz gözlənilir ki, siz mktree zəng zaman, bir göstərici bir ağac boy mallocs bu NULL dəyəri, belə 0s və ya NULLs, bu dəyərlərin bütün initializes və sonra yalnız sizin üçün malloc'd etdik ki, ağac üçün pointer qaytarır. Burada ağac aradan zəng zaman ilk ikiqat azad deyilik təmin edir. Bu, həqiqətən, aradan qaldırılması, istədiyiniz bir ağac var ki, təmin edir. Bir ağac da öz uşaqlar daxildir, çünki burada Bu nə o recursively ağac sol node haqqında ağac aradan çağırır habelə sağ node kimi. Bu ana kurtarır əvvəl, habelə uşaqların azad etmək lazımdır. Ana da kök ilə əvəz edir. Belə böyük-böyük-böyük-böyük babası kimi ilk valideyn, və ya nənə ağac, ilk biz ilk səviyyəsi aşağı azad var. Belə ki, o, pulsuz altına axır, sonra o, s, geri pulsuz gəlib Belə ki, ağac var. İndi biz meşə baxın. Siz Huffman ağac bütün yerləşdirmək yerləşir Forest edir. Bu süjet adlı biz bir şey olacaq ki, var ki, bir ağac bir göstərici, eləcə də sonrakı adlı süjet bir göstərici var. Hansı struktur kimi baxmaq bu cür edir? Bu cür orada artıq deyir. Burada artıq. A bağlı siyahısı. Biz bir süjet zaman bu sahələri bir bağlı siyahı kimi görürük. A meşə, sahələrinin bağlı siyahı kimi müəyyən edilir və belə meşə quruluşu biz yalnız bizim ilk süjet bir göstərici var olacaq ki, və süjet içinde bir ağac və ya daha çox ağac işarə və sonra və s, növbəti sahəsi göstərir. Meşə etmək üçün biz mkforest çağırırıq. Sonra biz burada olduqca faydalı funksiyaları vardır. Siz qaytarılması dəyəri Tree * sonra bir meşə keçir və Biz, seçin var bir ağac bir göstərici. Nə pick edəcəyik siz işarə edirik ki, meşə getmək edəcək o meşə aşağı tezlikli bir ağac çıxarmaq və o ağac sizə göstərici verir. Seçdiyiniz zəng sonra, ağac, artıq meşə mövcud deyil lakin qaytarılması dəyər ki, ağac göstəricisidir. Sonra bitki var. Bir qeyri-0 tezlik var ki, bir ağac bir pointer keçmək şərtlə ki, nə bitki edəcəyik ki, meşə alması ağac almaq və bitki edir ki, meşə ağac daxilində. Burada rmforest var. Əsasən bizim ağac bütün azad olan ağac, aradan qaldırılması Oxşar meşə aradan qaldırılması meşə olan pulsuz hər şey olacaq. Biz forest.c baxmaq varsa, orada ən azı 1 rmtree əmr görmək üçün gözləmək lazımdır çünki bir meşə bu ağacları var əgər meşə pulsuz yaddaş, sonra nəhayət, siz də o ağacları aradan qaldırılması üçün olacaq. Biz forest.c baxmaq varsa, biz gözləyirik kimi olan mkforest var. Biz malloc şeylər. Ilə başlamaq üçün boş, çünki Biz, NULL kimi meşə ilk süjet başlamaq biz ən aşağı çəki ilə ağac qaytarır olan pick, aşağı tezlikli bax və sonra xüsusi node xilas olur ki, ağac bal və növbəti bir, belə ki, meşə bağlı siyahı ki, edir. Və sonra biz burada olan bağlı siyahısına daxil edər bir ağac bitki var. Nə meşə, bu gözəl, bizim üçün sıralanır saxlayır deyil. Və sonra, nəhayət, biz gözlənildiyi kimi, biz orada deyilir rmtree var rmforest var. Bu günə qədər paylama kodu baxanda huffile.c, başa qədər ağır tərəfindən yəqin idi digər faylları halbuki özləri riayət etmək olduqca sadə idi. Göstəricilərinə və bağlı siyahıları və bizim bilik ilə, biz olduqca yaxşı əməl edə bildik. Amma biz həqiqətən biz tam başa əmin etmək lazım olan bütün. H faylları edir Siz, o geri dəyərləri ilə məşğul olan, həmin funksiyaları zəng etmək lazımdır, çünki belə tam həyata gedir nə hərəkət başa əmin olun bu funksiyaları bir zəng zaman. Amma həqiqətən daxilində anlaşma biz həmin çünki olduqca zəruri deyil. H faylları. Biz bölüşdürülməsi kodu qalan 2 daha çox fayl var. Nin dump baxaq. Burada comment ilə kötük bir Huffman sıkıştırılmış fayl edir və sonra tərcümə və zibilliklərin onun məzmunu bütün. Burada o hfopen zəng ki, görürük. Bu, * input = fopen fayl aynalama növü və sonra məlumat keçir. Əvəzinə bir Huffile keçən edirik bir file * istisna olmaqla demək olar ki, eyni deyil; əvəzinə fopen sizə hfopen keçən edirik. Burada cür biz mövzu oxumaq necə oxşar olan, ilk mövzu oxumaq bir bitmap fayl üçün. Biz burada edirik görmək yoxlanılması olub başlığı məlumat bir faktiki Huff fayl ki, göstərir ki, doğru sehrli sayı ehtiva edir, sonra əmin həmin çek bütün biz açıq bir faktiki huffed fayl və ya deyil ki, fayl ki. Bu nə biz görürük ki, rəmzləri bütün tezliklərdə çıxışlar edir qrafik masa bir terminal daxilində. Bu hissə faydalı olacaq. Bu bir az var və dəyişən bit daxil yavaş-yavaş oxuyur və sonra çap edir. Mən bir fayl huffing nəticəsində olan hth.bin üzrə dump zəng idi əgər heyəti həll istifadə edərək, mən bu almaq olardı. Bu simvol bütün tipi və onlar görünür hansı tezlik verilməsi oldu. Biz baxsaq, onların əksəriyyəti bu istisna 0s olunur: iki dəfə görünür H, və sonra bir dəfə görünür T. Və sonra biz burada 0s və 1s faktiki mesaj var. Biz hth.txt baxsaq, bu, güman huffed ki, orijinal mesaj biz bəzi Hs və Ts görmək gözləyirik. Xüsusilə, biz yalnız 1 T və 2 Hs görmək gözləyirik. Burada hth.txt var. Bu, həqiqətən HTH var. Biz bunu görə bilmirik, baxmayaraq ki, orada daxil bir newline karakter. The Huff fayl hth.bin də həmçinin newline karakter kodlama olunur. Burada biz, sifariş newline sonra HTH və bilirik ki, çünki biz yalnız bir 1 yəqin ki, H təmsil görə bilərsiniz və sonra T yəqin ki, 01 və sonrakı H 1 eləcə və sonra biz iki 0s tərəfindən göstərilən bir newline var. Cool. Və sonra, nəhayət, biz çox. C ilə məşğul olan və. Edirik çünki h faylları, biz compiler üçün olduqca kompleks bəhanə olacaq və belə ki, burada sizin üçün dump edir Makefile var. Amma faktiki olaraq, öz puff.c fayl edilməsi haqqında getmək üçün var. Bu Makefile həqiqətən sizin üçün puff.c edilməsi ilə məşğul deyil. Biz Makefile redaktə sizə qədər tərk edirik. Siz bütün kimi bir komanda daxil edərkən, məsələn, bu sizin üçün bütün edəcək. Ötən pset dən Makefile nümunələri baxmaq üçün çekinmeyin eləcə də sizin Puff fayl edə bilər necə bu bir gediş bu Makefile redaktə edir. Yəni bizim paylanması kodu bu barədə var. Biz vasitəsilə kazanılmış sonra, sonra burada yalnız bir öyüd-nəsihət var necə ki, biz Huffman qovşaqlarının ilə məşğul olmaq üçün olacaq. Biz artıq onlara qovşaqlarının zəng etmək fikrində deyilik, biz onlara ağac zəng etmək olacaq biz bir char öz rəmzi təmsil olacaq yerləşir, onların tezliyi, bir tam olan hadisələr sayı. Bir float daha dəqiq çünki Biz istifadə edirik. Və sonra biz sol uşaq, eləcə də sağ uşaq başqa bir göstərici yoxdur. A meşə, biz gördüyümüz kimi, yalnız ağac bağlı siyahısı. Nəhayət, biz Huff fayl yaradılmasına etdiyiniz zaman, biz forest yalnız 1 ağac ehtiva istəyirəm - 1 ağac, bir çox uşaqlar ilə 1 kök. Əvvəllər biz yalnız bizim Huffman ağacları edirdilər zaman, biz ekran üzərində qovşaqlarının bütün qoymaqla başlayıb və biz bu qovşaqlarının var olacaq deyərək nəhayət yarpaqları olmaq olacaq və bu, onların simvoludur, bu onların tezliyi edir. Biz yalnız 3 məktub varsa, bizim meşə ki, 3 ağac bir meşə var. Və sonra biz ilk valideyn əlavə zaman, getmək kimi biz 2 ağacların meşə etdi. Biz meşə həmin uşaqların 2 çıxarılır və sonra bir valideyn node ilə əvəz uşaqlar kimi o 2 qovşaqlarının idi. Və sonra nəhayət, bizim son olaraq, pansiyonlar ilə məsələn edilməsi ilə addım və Cs son ana etmək olardı, və belə sonra 1-meşə ağacları bizim ümumi sayı gətirəcəyini. Hər kəs sizin meşə çox ağac ilə başlamaq necə görür və 1 ilə qədər? Okay. Cool. Biz Puff üçün nə etmək lazımdır? Biz nə etmək lazımdır kimi həmişə, onlar bizə giriş hüququ növü vermək təmin edilir biz, həqiqətən, bu proqram çalıştırabilirsiniz ki. Bu halda onlar ilk komanda-line arqument sonra bizə verilməsi üçün olacaq 2: biz decompress və decompressed faylı çıxış istədiyiniz faylı. Amma bir dəfə biz, onlar dəyərlər hüququ məbləği bizə keçir əmin olun biz daxil Huff fayl və ya deyil ki, təmin etmək istəyirik. Və sonra bir dəfə biz, sonra biz ağac qurmaq istəyirik, bu Huff fayl ki, zəmanət bu mesajı şəxs inşa ağac oyunları belə ağac qurmaq. Biz ağac qurmaq sonra, biz ilə 0s və onlar keçdi 1s, məşğul ola bilər bu eyni, çünki, bizim ağac yanaşı bu əməl və sonra, mesaj yazmaq chars geri bit şərh. Və sonra sonunda biz burada göstəricilər ilə məşğul olduğunuz çünki Biz hər hansı bir yaddaş sızıntıları yoxdur əmin etmək istəyirəm və biz pulsuz hər şey. Düzgün istifadə edilməsi artıq bizim üçün köhnə hat edir. Biz daxil etmək, hansı kabartmak üçün fayl adı olacaq, və sonra bir çıxış müəyyən belə mətn faylı olacaq puffed çıxış üçün fayl adı. Bu istifadə edir. İndi biz daxil huffed və ya deyil ki, təmin etmək istəyirik. Geri düşüncələri, bizə kömək edə bilər ki, distribution kodu orada bir şey idi bir fayl huffed və ya olub-olmadığını anlama ilə? Bu Huffeader haqqında huffile.c məlumat var idi. Biz hər Huff fayl sehrli sayı ilə bağlı Huffeader var bilirik ki, hər rəmzi üçün tezliklərin eləcə də bir sıra həmçinin bir checksum kimi. Biz bilirik ki, ancaq biz də dump.c bir peek etdi olan bir Huff fayla oxuyurdum. Və bunu, o, həqiqətən huffed və ya olub-olmadığını yoxlamaq idi. Belə ki, bəlkə biz puff.c. üçün struktur kimi dump.c istifadə edə bilər Geri pset 4 biz RGB üç dəfə replikasiya ki fayl copy.c zaman və biz Whodunit və RSS üçün şərh eyni, nə edə yalnız cp dump.c puff.c kimi komanda çalışır və kodu bəzi istifadə edin. Lakin, bir müddət kimi sadə olacaq deyil puff.c daxil dump.c çevrilməsində, lakin ən azı başlamaq üçün haradasa verir giriş həqiqətən huffed və ya təmin etmək üçün necə həmçinin bir neçə digər şeylər kimi. Biz düzgün istifadə təmin giriş huffed ki, təmin etmişdir. Biz müvafiq səhv yoxlanılması etmişik etdik ki, hər zaman, belə bir problem varsa, geri və bir uğursuzluq baş əgər funksiyası çıxdıqda. İndi biz nə etmək istəyirəm faktiki ağac qurmaq deyil. Biz Meşə baxsanız, 2 əsas funksiyaları var biz çox tanış olmaq istədiyiniz olacaq ki,. Orada Boolean funksiyası bitki ki, bizim meşə daxilində qeyri-0 tezlik ağac bitkiləri. Və orada bir meşə və ağac bir göstərici bir pointer ilə keçir. Sadə sual: Bir Huffman ağac tikinti etdiyiniz zaman neçə meşə siz olacaq? Bizim meşə hüququ, bizim kətan kimi? Beləliklə, biz yalnız 1 meşə var olacaq, lakin biz çox ağac var olacaq. Siz bitki zəng Belə əvvəl ehtimalla sizin meşə etmək istəyirəm olacaq. Bir meşə edə bilər necə forest.h baxmaq əgər bir komanda üçün var. Siz bir ağac əkmək bilər. Biz bunu bilirik. Və sonra da, meşə bir ağac ala bilərsiniz aşağı çəki ilə bir ağac aradan qaldırılması və sizə göstərici verilməsi. Biz nümunələri özümüz bunu zaman geri düşüncələri, biz onu rəsm zaman biz sadəcə yalnız links əlavə edib. Amma burada əvəzinə yalnız links əlavə bu qovşaqlarının 2 aradan qaldırılması və sonra başqa bir ilə əvəz etdiyiniz kimi daha düşünün. Seçmək və əkin baxımından ifadə etmək üçün, 2 ağacları picking və sonra başqa bir ağac əkilməsi edirik ki, siz uşaqlar kimi seçilmiş olan 2 ağacları var. Huffman nin ağac qurmaq üçün, üçün simvollar və tezliklərdə oxuya bilərsiniz bu Huffeader sizə verir, çünki Siz tezliklərin bir sıra verir. Beləliklə, siz davam edə bilər və yalnız bu 0 şey ignore biz bu ilin sonunda 256 yarpaqları istəmirəm çünki. Biz yalnız simvol ki, yarpaqları sayı istəyirəm əslində fayl istifadə olunur. Siz bu işarələri oxumaq və qeyri-0 tezliklərin ki, bu simvol hər bilər o ağac olacaq. Nə olar, bir qeyri-0 tezlik simvolu oxumaq hər zaman siz meşə ki, ağac əkmək bilər. Siz meşə ağacları əkmək sonra, bacı kimi bu ağac qoşulmaq olar Belə ki, əkin və seçin yerləşir aldığınız 2 və sonra bitki 1 geri gedir 1-ki, bitki siz seçilmiş ki, 2 uşaq valideyn edir. Belə ki, sonra son nəticə sizin meşə bir ağac olacaq. Bu sizin ağac qurmaq nasıl. Burada yanlış getmək bilər ki, bir neçə şey var çünki biz yeni ağac edilməsi və bu kimi göstəricilər və hər şeyi ilə məşğul ilə məşğul olursunuz. Biz göstəricilər ilə məşğul olan zaman əvvəl, biz malloc'd zaman biz bunu bizə NULL pointer dəyər qaytarmayıb əmin etmək istəyirdi. Beləliklə, bu prosesi çərçivəsində bir neçə addımlar bir neçə hallarda olmalıdır gedir Ü proqram uğursuz ola bilər. Nə istəyirəm, siz bu səhvlər idarə əmin etmək istəyirəm ki, və spec bu, qəşəng onları idarə etmək üçün deyir belə proqram çıxmaq var niyə izah istifadəçi bir mesaj çap istəyirəm və sonra dərhal bu çıxın. Bu səhv rəftar etmək, onu yoxlamaq istəyirəm ki, xatırlayıram uğursuz ola bilər ki, hər bir zaman. Yeni bir pointer edirik ki, hər bir zaman Əgər uğurlu və əmin etmək istəyirəm. Yeni bir pointer və malloc onu nə üçün istifadə nə əvvəl, və sonra biz bu göstərici NULL olub yoxlamaq olardı. Belə ki, bunu yalnız bilər, bəzi hallarda olmalıdır gedir amma bəzən həqiqətən bir funksiyası zəng etdiyiniz və funksiyası ərzində ki, mallocing məşğul olan biri. Bu halda, biz kodu çərçivəsində funksiyaları bəzi geri baxmaq əgər, bəziləri Boolean funksiyaları. Abstrakt halda biz foo adlı Boolean funksiyası varsa, əsasən, biz foo nə olursa olsun bunu əlavə güman edə bilər bir Boolean funksiyası olduğundan, bu, doğru və ya yalan qaytarır - əgər doğru uğurlu, yalan əgər. Beləliklə, biz foo qaytarılması dəyəri doğru və ya yalan olub-olmadığını yoxlamaq istəyirlər. O yalan varsa, biz mesajı bir növ çap etmək istəyirəm olacaq o deməkdir ki, və sonra proqram çıxın. Biz nə istəyirik foo qaytarılması dəyəri kontrol edir. Foo yalan qaytarır, onda biz səhv bir növ rast bilirik ki, və biz proqram çıxmaq lazımdır. Bunun yolu faktiki funksiyası özü üçün şərt olduğu bir vəziyyət var. Foo x götürür söyləyin. Biz əgər bir şərt kimi ola bilər (foo (x)). Foo icra sonunda doğru qayıtdıqda əgər əsasən, o deməkdir ki, funksiyası foo qiymətləndirmək, çünki biz bunu edə bilərsiniz bütün şəraiti qiymətləndirmək üçün. Belə ki, o funksiyası doğru qayıdır və uğurlu Əgər bir şey edə bilərsiniz. Amma səhv yoxlanılması olduğunuzda, siz yalnız funksiyası yalan qaytarır əgər çıxmaq istəyirəm. Nə edə bilərdi yalnız əlavə edilir == saxta və ya yalnız qarşısında bang əlavə sonra (! foo) əgər var. Bu şərtlə ki, ki, bədən daxilində siz səhv rəftar bütün olardı belə "Bu ağac yaratmaq bilmədi" kimi və sonra 1 və ya bu kimi bir şey geri. Ki, nə olsa da, foo yalan geri baxmayaraq ki, - Foo doğru qaytarır söyləyin. Sonra yenidən foo zəng etmək yoxdur. Bu ümumi misconception var. Sizin vəziyyətdə idi, çünki artıq qiymətləndirilir ki, siz ağac və ya kimi bir şey etmək kullanıyorsanız siz artıq nəticə var və ya bitki və ya seçin və ya bir şey. Bu artıq dəyər var. Artıq icra edir. Belə ki, vəziyyət Boolean funksiyaları istifadə etmək faydalıdır çünki və ya, həqiqətən, loop orqanı həyata deyil, hər halda funksiyasını icra edir. Son addım Bizim ikinci fayl mesaj yazır. Sonra biz Huffman ağac tikmək, sonra fayl mesaj yazılı olduqca sadə deyil. Bu, yalnız 0s və 1s riayət indi olduqca sadə var. Və qaydaları ilə biz bir Huffman ağac ildə 0s tərk göstərir bilirik ki, və 1s sağ göstərir. Bir 0 almaq ki, yavaş-yavaş oxumaq Beləliklə, əgər hər dəfə Əgər 1-ci oxumaq hər zaman sonra sol qolu edin və lazımdır sağ filialı izləmək olacaq. Bir yarpaq hit qədər və sonra davam etmək olacaq yarpaqları filiallarının sonunda olacaq, çünki. Biz bir yarpaq və ya təşkil etdik olub necə deyə bilərsiniz? Biz əvvəl bildirib. [Tələbə] Bu göstəricilər NULL edin. >> Bəli. Sol və sağ, həm də ağaclar üçün göstəricilərinə NULL, əgər biz bir yarpaq təşkil etdik, biz deyə bilərik. Mükəmməldir. Biz Huff fayla yavaş-yavaş oxumaq istəyirəm ki, bilirik. Biz dump.c əvvəl gördüm ki, onlar nə onlar Huff fayla yavaş-yavaş oxumaq deyil və yalnız bit nə çap. Biz bunu etmək fikrində deyilik. Biz bir az daha kompleks olduğunu bir şey bunu etmək olacaq. Amma nə biz nə edə bilər, biz bit üçün deyilir ki kodu ki, bit almaq olar. Burada biz istəyirik ki, cari bit təmsil tam bit var. Dosyayı sonunda hit qədər Bu faylı bit bütün iterating qayğısına qalır. Ki, əsasən, sonra iterator bir növ istəyirəm olacaq Sizin ağac axır etmək. Və sonra bit 0 və ya 1 olub əsaslanır ya sol ki iterator hərəkət və ya sağa hərəkət etmək istəyirəm olacaq bütün yolu bir yarpaq hit qədər, belə ki, bütün yol etdiyiniz ki node qədər daha çox qovşaqlarının qeyd deyil. Niyə biz bir Huffman fayl deyil Morze əlifbası ilə bunu edə bilərsiniz? Morse kodu qeyri bir az var idi. Biz gözləyin oh kimi ola bilər ki, yol boyunca bir məktub edib sonra, belə bəlkə bu, bizim məktub biz yalnız bir az artıq davam edərsə, onda biz başqa məktub hit olardı halbuki. Amma ki, Huffman encoding baş gedən deyil biz olacaq ki, yalnız yol xarakteri edib ki, arxayın ola bilərsiniz ki node sol və sağ uşaqlar NULL əgər edir. Nəhayət, biz yaddaş bütün azad etmək istəyirik. Biz məşğul olduğunuz hər iki yaxın Huff fayl istəyirəm habelə meşə ağacları bütün çıxarın. Sizin həyata əsaslanır, yəqin ki, meşə aradan səslənmək istəyirəm olacaq əvəzinə faktiki ağac özünüzü bütün keçir. Əgər hər hansı bir müvəqqəti ağacları edilən Lakin, bu azad lazımdır. Siz yaxşı bilirsiniz kodu, belə yaddaş ayrılması olduğunuz bilirsiniz. Və siz getmək əgər, malloc üçün F'ing hətta Control ilə başlamaq görən zaman malloc və ki, bütün azad əmin edilməsi lakin sonra yalnız, kodu keçir yaddaş ayrılmış ola bilər Ü anlama. Adətən yalnız "bir fayl sonunda mən yalnız mənim meşə meşə aradan qaldırılması üçün gedirəm" deyə bilər belə əsasən pulsuz ki, yaddaş sil ki, "Və sonra da faylı bağlamaq və sonra mənim proqram çıxmaq niyyətindədir gedirəm." Lakin proqram fit ki, yalnız vaxt? Xeyr, çünki bəzən baş verən bir səhv var bilər. Bəlkə bir fayl açmaq bilməz və ya başqa bir ağac gələ bilmədi və ya səhv bir növ yaddaş ayrılması prosesi baş və buna NULL döndü. Bir səhv baş, sonra geri və çıxın. Beləliklə, sizin proqram hər hansı bir zamanda tərk edə bilər ki, əmin etmək istəyirəm siz yaddaş bütün azad etmək istəyirik. Bu yalnız sizin kodu çıxmaq əsas funksiyası çox sonunda olacaq deyil. Siz kodu potensial vaxtından əvvəl geri ola bilər ki, hər bir instansiya geri baxmaq istəyirəm və sonra azad nə yaddaş hissi verir. Siz meşə etmək və saxta geri çağırmışdı edirlər. Sonra yəqin ki, meşə aradan qaldırılması lazım deyil Henüz bir meşə yoxdur çünki. Amma kodu hər nöqtəsində sizi vaxtından əvvəl geri bilər Ü Əgər hər hansı yaddaş azad əmin etmək istəyirəm. Beləliklə, biz yaddaş azad ilə məşğul olan və potensial itkilərin qarşılaşdıqda zaman, biz qərar və məntiq istifadə yalnız mənə həm də düzgün və ya bizim yaddaş bütün azad belirlemek üçün Valgrind istifadə edin. Siz ya Puff haqqında Valgrind çalıştırabilirsiniz və sonra siz də onu keçmək üçün komanda-line dəlilləri hüququnu sayı Valgrind üçün. Siz çalıştırabilirsiniz, ancaq çıxış bir az sirli edir. Biz Speller ilə istifadə bir az kazanılmış sonra, lakin biz hələ bir az daha kömək lazımdır belə, sonra qaçaq kontrol = tam kimi bir neçə bayraqları ilə çalışan ki, yəqin ki, bizə Valgrind bir çox faydalı çıxış edəcək. Sonra ayıklama etdiyiniz zaman digər faydalı tip fərq əmr edir. Siz Huff heyəti icrası daxil run bir metin fayl, bilər və sonra xüsusi olmaq, ikili fayl, ikili Huff fayl üçün çıxış. Sonra ki, ikili fayl öz yastıq run, əgər sonra ideal, sizin outputted mətn faylı eyni olacaq Daxil keçdi orijinal bir Burada nümunə kimi hth.txt kullanıyorum və sizin spec haqqında danışdı biri. Bu sözün yalnız HTH sonra newline var. Amma mütləq çekinmeyin və siz mütləq artıq nümunələr istifadə etmək tövsiyə olunur mətn faylı üçün. Siz hətta decompressing sonra bəlkə kompressor bir shot almaq olar Müharibə və Sülh kimi Speller istifadə olunan faylları bəzi və ya Jane Austen və ya kimi bir şey - sərin cür ki, - və ya Austin Powers, biz bu böyük faylları ilə məşğul cür enmək deyil, çünki Burada növbəti aracı, ls-l istifadə edin. Biz əsasən cari kataloq bütün məzmunu listeler ls, istifadə edirik. Bayraq-l keçən həqiqətən bu faylların ölçüsünü göstərir. Siz pset spec keçir, bu, həqiqətən, ikili fayl yaratmaq vasitəsilə dolaşır onu huffing və siz çox kiçik faylları görmək bu kompressor və məlumat bütün tərcümə yer dəyəri kimi bütün tezliklərdə və şeyi faktiki fayda üstələyir ilk növbədə fayl sıxılma edir. Bir uzun mətn faylları run əgər Lakin, sonra sizə bir xeyir əldə etmək başlamaq ki, görə bilərsiniz bu faylları kompressor edir. Və sonra, nəhayət, biz mütləq çox lazımlı gələcək olan bizim köhnə dost gdb var. Biz ağaclar edilməsi bəlkə Huff ağac və ya prosesin hər hansı bir sual yoxdur və ya Huff'n Puff hər hansı digər suallar? Okay. Mən bir az ətrafında qalmaq lazımdır. Thanks, everyone. Bu gözden geçirmek 6 idi. Və uğurlar yaxşı. [CS50.TV]