1 00:00:00,000 --> 00:00:02,210 [Powered by Google Translate] [Walkthrough - Tatizo Set 6] 2 00:00:02,210 --> 00:00:04,810 [Zamyla Chan - Chuo Kikuu cha Harvard] 3 00:00:04,810 --> 00:00:07,240 [Hii ni CS50. - CS50.TV] 4 00:00:07,240 --> 00:00:12,180 >> Hello, kila mtu, na kuwakaribisha kwa walkthrough 6: Huff'n Puff. 5 00:00:12,180 --> 00:00:17,440 Katika Puff Huff'n tunafanya nini ni kwenda kushughulika na faili Huffman USITUMIE 6 00:00:17,440 --> 00:00:20,740 na kisha mitweto nyuma juu, hivyo decompressing yake, 7 00:00:20,740 --> 00:00:25,810 ili tuweze kutafsiri kutoka sekunde 0 na 1s kwamba mtumiaji zituma sisi 8 00:00:25,810 --> 00:00:30,660 na kubadili nyuma katika maandishi ya awali. 9 00:00:30,660 --> 00:00:34,360 Pset 6 ni kwenda kuwa pretty cool kwa sababu wewe utaenda kuona baadhi ya zana 10 00:00:34,360 --> 00:00:41,730 kwamba kutumika katika pset 4 na 5 pset na aina ya kuchanganya yao ndani ya dhana 1 pretty nadhifu 11 00:00:41,730 --> 00:00:43,830 wakati wewe kuja kufikiria kuhusu hilo. 12 00:00:43,830 --> 00:00:50,110 >> Pia, arguably, pset 4 na 5 walikuwa wengi changamoto psets kwamba alikuwa na kutoa. 13 00:00:50,110 --> 00:00:53,950 Basi, tangu sasa, sisi tuna hii pset 1 zaidi katika C, 14 00:00:53,950 --> 00:00:56,480 na kisha baada ya kuwa tuko juu ya programu ya mtandao. 15 00:00:56,480 --> 00:01:02,310 Hivyo kumpongeza wenyewe kwa ajili ya kupata zaidi ya hump toughest katika CS50. 16 00:01:03,630 --> 00:01:09,760 >> Kuhamia kwenye kwa Puff Huff'n, toolbox yetu kwa pset hii itakuwa ni ya Huffman miti, 17 00:01:09,760 --> 00:01:14,700 hivyo si tu kuelewa jinsi miti binary kazi lakini pia hasa miti Huffman, 18 00:01:14,700 --> 00:01:16,240 jinsi re yalijengwa. 19 00:01:16,240 --> 00:01:20,210 Na kisha tunakwenda kuwa na mengi ya maadili ya usambazaji katika pset hii, 20 00:01:20,210 --> 00:01:22,480 na tutaweza kuja kuona kwamba kweli baadhi ya maadili ya 21 00:01:22,480 --> 00:01:24,670 tupate kuwa na uwezo wa kuelewa kikamilifu bado, 22 00:01:24,670 --> 00:01:30,080 na hivyo wale itakuwa c. files, lakini basi. yao kuandamana h files 23 00:01:30,080 --> 00:01:34,300 atatupa kutosha kuelewa kwamba tunahitaji ili tujue jinsi wale utendaji kazi 24 00:01:34,300 --> 00:01:38,100 au angalau kile tunachopaswa kufanya - pembejeo zao na matokeo - 25 00:01:38,100 --> 00:01:40,760 hata kama hatujui nini kinatokea katika sanduku nyeusi 26 00:01:40,760 --> 00:01:44,090 au hawajui nini kinatokea katika sanduku nyeusi ndani. 27 00:01:44,090 --> 00:01:49,400 Na kisha hatimaye, kama kawaida, sisi ni kushughulika na miundo mpya data, 28 00:01:49,400 --> 00:01:51,840 aina maalum ya nodes kwamba kumweka kwa mambo fulani, 29 00:01:51,840 --> 00:01:56,080 na hivyo hapa kuwa kalamu na karatasi si tu kwa ajili ya mchakato wa kubuni 30 00:01:56,080 --> 00:01:58,470 na wakati wewe ni kujaribu kufikiri ni jinsi gani pset yako lazima kazi 31 00:01:58,470 --> 00:02:00,520 lakini pia wakati wa debugging. 32 00:02:00,520 --> 00:02:06,140 Unaweza kuwa GDB sambamba kalamu yako na karatasi wakati wewe kuchukua chini nini maadili ni, 33 00:02:06,140 --> 00:02:09,320 ambapo mishale yako ni akizungumzia, na mambo kama hayo. 34 00:02:09,320 --> 00:02:13,720 >> Kwanza hebu angalia miti Huffman. 35 00:02:13,720 --> 00:02:19,600 Huffman miti ni binary miti, kwa maana kwamba kila node tu ana watoto 2. 36 00:02:19,600 --> 00:02:24,870 Katika miti Huffman tabia ni kwamba maadili ya mara kwa mara 37 00:02:24,870 --> 00:02:27,140 huwakilishwa na bits fewest. 38 00:02:27,140 --> 00:02:32,690 Tuliona katika mifano hotuba ya Morse code, ambayo aina ya kuimarishwa baadhi barua. 39 00:02:32,690 --> 00:02:38,030 Kama wewe ni kujaribu kutafsiri A au E, kwa mfano, 40 00:02:38,030 --> 00:02:43,940 wewe ni kutafsiri kwamba mara nyingi, hivyo badala ya kuwa na matumizi ya seti kamili ya bits 41 00:02:43,940 --> 00:02:48,640 zilizotengwa kwa ajili ya aina ya kwamba kwa kawaida data, wewe compress ni chini ya wachache, 42 00:02:48,640 --> 00:02:53,730 na kisha barua wale kuwakilishwa chini mara nyingi ni kuwakilishwa na bits tena 43 00:02:53,730 --> 00:02:59,840 kwa sababu unaweza kumudu kwamba wakati wewe kupima nje frekvenser kwamba wale barua kuonekana. 44 00:02:59,840 --> 00:03:03,020 Sisi kuwa na wazo sawa hapa katika miti Huffman 45 00:03:03,020 --> 00:03:12,360 ambapo sisi ni maamuzi ya mnyororo, aina ya njia ya kupata baadhi ya wahusika. 46 00:03:12,360 --> 00:03:14,470 Na kisha wahusika ambao wana frequency wengi 47 00:03:14,470 --> 00:03:17,940 itakuwa ni ya kuwakilishwa na bits fewest. 48 00:03:17,940 --> 00:03:22,020 >> njia ambayo wewe kujenga mti Huffman 49 00:03:22,020 --> 00:03:27,430 ni kwa kuweka yote ya wahusika kuwa itaonekana katika maandishi 50 00:03:27,430 --> 00:03:30,630 na kuhesabu frequency wao, jinsi mara nyingi wao kuonekana. 51 00:03:30,630 --> 00:03:33,880 Hii inaweza ama kuwa kuhesabu ya mara ngapi wale barua itaonekana 52 00:03:33,880 --> 00:03:40,270 au labda asilimia ya nje ya wahusika wote ngapi kila mmoja inaonekana. 53 00:03:40,270 --> 00:03:44,270 Na hivyo nini kufanya ni mara moja una yote ya nje kwamba mapped, 54 00:03:44,270 --> 00:03:49,060 basi ukiangalia kwa frekvenser 2 chini na kisha kujiunga nao kama ndugu 55 00:03:49,060 --> 00:03:55,660 ambapo kisha nodi mzazi ana frequency ambayo ni jumla ya watoto wake 2. 56 00:03:55,660 --> 00:04:00,870 Na kisha kwa kusema kwamba mkataba nodi wa kushoto, 57 00:04:00,870 --> 00:04:03,770 wewe kufuata kwamba kwa kufuata tawi 0, 58 00:04:03,770 --> 00:04:08,140 na kisha nodi rightmost ni tawi 1. 59 00:04:08,140 --> 00:04:16,040 Kama tulivyoona katika Morse code, gotcha moja ilikuwa kwamba kama alikuwa tu beep beep na 60 00:04:16,040 --> 00:04:18,120 ilikuwa na utata. 61 00:04:18,120 --> 00:04:22,430 Ni inaweza ama kuwa 1 barua au inaweza kuwa mlolongo wa barua 2. 62 00:04:22,430 --> 00:04:27,790 Na hivyo kile Huffman miti gani ni kwa sababu kwa asili ya wahusika 63 00:04:27,790 --> 00:04:34,140 au mwisho wetu halisi wahusika kuwa nodes mwisho juu ya tawi - 64 00:04:34,140 --> 00:04:39,300 sisi rejea wale kama majani - kwa mujibu wa kwamba kuna hawezi kuwa yeyote ambiguity 65 00:04:39,300 --> 00:04:45,160 katika suala la barua ambayo wewe ni kujaribu encode na mfululizo wa bits 66 00:04:45,160 --> 00:04:50,670 kwa sababu hakuna mahali popote pamoja bits kwamba kuwakilisha 1 barua 67 00:04:50,670 --> 00:04:55,960 itakuwa kukutana barua nyingine kwa ujumla, na hakutakuwa na fujo yoyote pale. 68 00:04:55,960 --> 00:04:58,430 Lakini tutaweza kwenda katika mifano kwamba wewe guys unaweza kweli kuona kwamba 69 00:04:58,430 --> 00:05:02,120 badala ya sisi tu nawaambia kwamba kwamba ni kweli. 70 00:05:02,120 --> 00:05:06,390 >> Hebu tuangalie mfano rahisi ya mti Huffman. 71 00:05:06,390 --> 00:05:09,380 Nina string hapa kwamba ni 12 wahusika mrefu. 72 00:05:09,380 --> 00:05:14,010 Nina 4 Kama, 6 Bs, na 2 Cs. 73 00:05:14,010 --> 00:05:17,270 Hatua yangu ya kwanza itakuwa kuhesabu. 74 00:05:17,270 --> 00:05:20,760 Je, ni mara nyingi inaonekana? Inaonekana mara 4 katika kamba. 75 00:05:20,760 --> 00:05:25,060 B inaonekana mara 6, na C inaonekana mara 2. 76 00:05:25,060 --> 00:05:28,970 Kikawaida, mimi naenda kusema mimi nina kutumia B mara nyingi, 77 00:05:28,970 --> 00:05:35,970 hivyo nataka kuwakilisha B na idadi fewest ya bits, idadi fewest ya sekunde 0 na 1s. 78 00:05:35,970 --> 00:05:42,600 Na kisha Mimi pia kwenda kutarajia C kuhitaji kiasi zaidi ya sekunde 0 na 1s pia. 79 00:05:42,600 --> 00:05:48,550 Kwanza nini mimi hapa ni mimi kuwekwa yao katika wakipanda ili katika suala la mzunguko. 80 00:05:48,550 --> 00:05:52,710 Tunaona kuwa C na A, wale ni wetu 2 chini frekvenser. 81 00:05:52,710 --> 00:06:00,290 Sisi kujenga nodi mzazi, na kwamba nodi mzazi hana barua yanayohusiana na hayo, 82 00:06:00,290 --> 00:06:05,070 lakini ni gani frequency, ambayo ni jumla. 83 00:06:05,070 --> 00:06:08,780 Jumla inakuwa 2 + 4, ambayo ni 6. 84 00:06:08,780 --> 00:06:10,800 Kisha sisi kufuata tawi kushoto. 85 00:06:10,800 --> 00:06:14,970 Kama tulikuwa kwamba nodi 6, basi sisi kufuata 0 kupata C 86 00:06:14,970 --> 00:06:17,450 na kisha 1 kupata A. 87 00:06:17,450 --> 00:06:20,300 Hivyo basi, tuna nodes 2. 88 00:06:20,300 --> 00:06:23,920 Tuna thamani 6 na kisha sisi pia kuwa na mwingine nodi thamani 6. 89 00:06:23,920 --> 00:06:28,550 Na hivyo wale 2 si tu 2 chini lakini pia tu 2 waliobaki, 90 00:06:28,550 --> 00:06:33,820 hivyo sisi kujiunga wale na mzazi mwingine, kwa kuwa jumla 12. 91 00:06:33,820 --> 00:06:36,300 Hivyo hapa tuna wetu Huffman mti 92 00:06:36,300 --> 00:06:40,020 ambapo kupata B, kwamba ingekuwa tu kuwa kidogo 1 93 00:06:40,020 --> 00:06:45,430 na kisha kupata tunataka kuwa 01 na kisha C kuwa 00. 94 00:06:45,430 --> 00:06:51,300 Hivyo hapa tunaona kwamba kimsingi sisi ni anayewakilisha chars hizi na ama bits 1 au 2 95 00:06:51,300 --> 00:06:55,160 ambapo B, kama ilivyotabiriwa, ana angalau. 96 00:06:55,160 --> 00:07:01,730 Na kisha sisi alikuwa anatarajiwa C kuwa wengi, lakini kwa vile ni ndogo vile Huffman mti, 97 00:07:01,730 --> 00:07:06,020 kisha pia kuwakilishwa na bits 2 kinyume na mahali fulani katikati. 98 00:07:07,820 --> 00:07:11,070 >> Tu kwenda juu ya mfano mwingine rahisi ya mti Huffman, 99 00:07:11,070 --> 00:07:19,570 kusema kuwa string "Hello." 100 00:07:19,570 --> 00:07:25,360 Unachofanya ni kwanza wewe kusema mara ngapi haina H itaonekana katika hili? 101 00:07:25,360 --> 00:07:34,200 H inaonekana mara moja na kisha e inaonekana mara moja na kisha tuna l kuonekana mara mbili 102 00:07:34,200 --> 00:07:36,580 na o kuonekana mara moja. 103 00:07:36,580 --> 00:07:44,310 Na hivyo basi tunatarajia ambayo barua kuwakilishwa na idadi ya angalau bits? 104 00:07:44,310 --> 00:07:47,450 [Mwanafunzi] l. >> L. Yeah. l ni haki. 105 00:07:47,450 --> 00:07:50,730 Tunatarajia l kuwakilishwa na idadi ya angalau bits 106 00:07:50,730 --> 00:07:55,890 kwa sababu l hutumika zaidi katika string "Hello." 107 00:07:55,890 --> 00:08:04,280 Nini mimi kwenda kufanya sasa ni kuteka nodi hiyo. 108 00:08:04,280 --> 00:08:15,580 Nina 1, ambayo ni H, na kisha mwingine 1, ambayo ni e, na kisha 1, ambayo ni o - 109 00:08:15,580 --> 00:08:23,410 hivi sasa mimi nina kuweka yao katika utaratibu - na kisha 2, ambayo ni l. 110 00:08:23,410 --> 00:08:32,799 Kisha mimi kusema kwamba mimi kujenga njia mti Huffman ni kupata nodes 2 na frekvenser angalau 111 00:08:32,799 --> 00:08:38,010 na kuwafanya ndugu kwa kujenga nodi mzazi. 112 00:08:38,010 --> 00:08:41,850 Hapa tuna 3 nodes na frequency chini. Wao ni wote 1. 113 00:08:41,850 --> 00:08:50,620 Hivyo hapa sisi kuchagua moja tunakwenda zilizounganishwa kwanza. 114 00:08:50,620 --> 00:08:54,850 Hebu sema mimi kuchagua H na e. 115 00:08:54,850 --> 00:09:01,150 Jumla ya 1 + 1 ni 2, lakini nodi hii haina barua yanayohusiana na hayo. 116 00:09:01,150 --> 00:09:04,440 Ni tu ana thamani. 117 00:09:04,440 --> 00:09:10,950 Sasa tunaangalia ijayo frekvenser 2 chini. 118 00:09:10,950 --> 00:09:15,590 Hiyo ni 2 na 1. Hiyo inaweza kuwa ama ya wale 2, lakini mimi nina kwenda kuchagua hii moja. 119 00:09:15,590 --> 00:09:18,800 Jumla ni 3. 120 00:09:18,800 --> 00:09:26,410 Na kisha hatimaye, mimi tu 2 wa kushoto, ili basi inakuwa 5. 121 00:09:26,410 --> 00:09:32,010 Ndipo hapa, kama ilivyotarajiwa, ikiwa mimi kujaza encoding kwa kuwa, 122 00:09:32,010 --> 00:09:37,480 1s ni daima tawi haki na sekunde 0 ni moja wa kushoto. 123 00:09:37,480 --> 00:09:45,880 Basi tuna l kuwakilishwa na kidogo tu 1 na kisha o na 2 124 00:09:45,880 --> 00:09:52,360 na kisha e na 2 na kisha H iko chini kwa vipande 3. 125 00:09:52,360 --> 00:09:59,750 Hivyo unaweza kupeleka ujumbe huu "Hello" badala ya kweli kwa kutumia herufi 126 00:09:59,750 --> 00:10:02,760 na tu sekunde 0 na 1s. 127 00:10:02,760 --> 00:10:07,910 Hata hivyo, kumbuka kwamba katika matukio kadhaa tulikuwa mahusiano na frequency yetu. 128 00:10:07,910 --> 00:10:11,900 Tunaweza aidha alijiunga na H o kwanza labda. 129 00:10:11,900 --> 00:10:15,730 Au na baadaye wakati tulikuwa l kuwakilishwa na 2 130 00:10:15,730 --> 00:10:19,410 kama vile alijiunga moja kuwakilishwa na 2, sisi inaweza kuwa wanaohusishwa aidha moja. 131 00:10:19,410 --> 00:10:23,630 >> Na hivyo wakati wewe kutuma sekunde 0 na 1s, kwamba kwa kweli haina dhamana ya 132 00:10:23,630 --> 00:10:27,090 kuwa mpokeaji anaweza kikamilifu kusoma ujumbe wako wa kulia mbali bat 133 00:10:27,090 --> 00:10:30,490 kwa sababu wao wanaweza kujua ambayo uamuzi uliofanya. 134 00:10:30,490 --> 00:10:34,920 Hivyo wakati sisi ni kushughulika na compression Huffman, 135 00:10:34,920 --> 00:10:40,090 namna fulani tuna kuwaambia mpokeaji wa ujumbe wetu jinsi tuliamua - 136 00:10:40,090 --> 00:10:43,470 Wanahitaji kujua aina fulani ya habari ya ziada 137 00:10:43,470 --> 00:10:46,580 kwa kuongeza katika ujumbe Komprimerade. 138 00:10:46,580 --> 00:10:51,490 Wanahitaji kuelewa nini mti kweli inaonekana kama, 139 00:10:51,490 --> 00:10:55,450 jinsi sisi kweli alifanya maamuzi hayo. 140 00:10:55,450 --> 00:10:59,100 >> Hapa tulikuwa tu kufanya mifano msingi kuhesabu halisi, 141 00:10:59,100 --> 00:11:01,550 lakini wakati mwingine unaweza pia kuwa mti Huffman 142 00:11:01,550 --> 00:11:05,760 msingi frequency ambayo barua kuonekana, na ni exact mchakato. 143 00:11:05,760 --> 00:11:09,090 Hapa nina akielezea ni katika suala la asilimia au sehemu, 144 00:11:09,090 --> 00:11:11,290 na hivyo hapa exact kitu. 145 00:11:11,290 --> 00:11:15,300 Mimi sioni 2 chini, jumla yao, 2 ijayo chini, jumla yao, 146 00:11:15,300 --> 00:11:19,390 mpaka nina mti kamili. 147 00:11:19,390 --> 00:11:23,610 Hata ingawa tunaweza kufanya hivyo aidha njia, wakati sisi ni kushughulika na asilimia, 148 00:11:23,610 --> 00:11:27,760 hiyo ina maana sisi ni kugawa vitu na kushughulika na decimals au tuseme ikifungwa 149 00:11:27,760 --> 00:11:30,900 kama sisi ni kufikiri kuhusu miundo ya data ya kichwa. 150 00:11:30,900 --> 00:11:32,540 Ni nini tunachojua kuhusu ikifungwa? 151 00:11:32,540 --> 00:11:35,180 Nini tatizo la kawaida wakati sisi ni kushughulika na ikifungwa? 152 00:11:35,180 --> 00:11:38,600 [Mwanafunzi] imprecise hesabu. >> Yeah. Kutokuwa sahihi. 153 00:11:38,600 --> 00:11:43,760 Kwa sababu ya kutokuwa sahihi floating uhakika, kwa pset hii ili tuweze kuhakikisha 154 00:11:43,760 --> 00:11:49,450 kwamba hatuwezi kupoteza maadili yoyote, basi sisi ni kweli kwenda kushughulika na kuhesabu. 155 00:11:49,450 --> 00:11:54,880 Hivyo kama ungekuwa kufikiria nodi Huffman, kama wewe kuangalia nyuma na muundo hapa, 156 00:11:54,880 --> 00:12:01,740 kama ukiangalia wale kijani ina frequency yanayohusiana na hayo 157 00:12:01,740 --> 00:12:08,760 kama vile inaelekeza katika nodi ili kushoto wake kama vile nodi ili haki yake. 158 00:12:08,760 --> 00:12:13,970 Na kisha ndio nyekundu kuna pia kuwa na tabia zinazohusiana nao. 159 00:12:13,970 --> 00:12:18,900 Sisi siyo kwenda kufanya ndio tofauti kwa ajili ya wazazi na kisha nodes ya mwisho, 160 00:12:18,900 --> 00:12:23,680 ambayo sisi rejea kama majani, lakini badala ya wale tu kuwa na maadili null. 161 00:12:23,680 --> 00:12:31,050 Kwa kila nodi tutaweza kuwa na tabia, alama nodi kwamba inawakilisha, 162 00:12:31,050 --> 00:12:40,490 kisha frequency kama vile pointer mtoto wake wa kushoto kama vile mtoto wake wa kulia. 163 00:12:40,490 --> 00:12:45,680 majani, ambayo ni chini sana, ingekuwa pia kuwa kuyatumia nodi 164 00:12:45,680 --> 00:12:49,550 kwa wao wa kushoto na wa haki zao, lakini tangu wale maadili si akizungumzia nodes halisi, 165 00:12:49,550 --> 00:12:53,970 gani thamani yao kuwa? >> [Mwanafunzi] null. >> Null. Hasa. 166 00:12:53,970 --> 00:12:58,430 Hapa ni mfano wa jinsi ya unavyoweza kuwakilisha frequency katika ikifungwa, 167 00:12:58,430 --> 00:13:02,130 lakini sisi ni kwenda kuwa kushughulika na kwa integers, 168 00:13:02,130 --> 00:13:06,780 hivyo wote mimi ni kubadilisha data aina huko. 169 00:13:06,780 --> 00:13:09,700 >> Hebu kwenda kidogo zaidi ya mfano tata. 170 00:13:09,700 --> 00:13:13,360 Lakini sasa tumekuwa kufanyika ndio rahisi, ni tu mchakato huo. 171 00:13:13,360 --> 00:13:20,290 Unakuta 2 frekvenser chini, jumla frekvenser 172 00:13:20,290 --> 00:13:22,450 na kwamba ni frequency mpya wa nodi mzazi wako, 173 00:13:22,450 --> 00:13:29,310 ambayo kisha anasema kwa upande wa kushoto wake na tawi 0 na haki na tawi 1. 174 00:13:29,310 --> 00:13:34,200 Kama tuna string "Hii ni cs50," basi, sisi kuhesabu ni mara ngapi ni T zilizotajwa, 175 00:13:34,200 --> 00:13:38,420 h zilizotajwa, i, s, c, 5, 0. 176 00:13:38,420 --> 00:13:42,010 Kisha nini mimi hapa ni pamoja na nodes nyekundu mimi tu kupandwa, 177 00:13:42,010 --> 00:13:48,530 Mimi alisema mimi naenda kuwa wahusika hawa hatimaye chini ya mti wangu. 178 00:13:48,530 --> 00:13:51,740 Wale ni kwenda kuwa yote ya majani. 179 00:13:51,740 --> 00:13:58,200 Kisha nini mimi ni mimi sorted yao na frequency katika wakipanda ili, 180 00:13:58,200 --> 00:14:02,950 na hii ni kweli njia kwamba code pset gani 181 00:14:02,950 --> 00:14:07,550 ni aina hiyo kwa frequency na kisha alphabetically. 182 00:14:07,550 --> 00:14:13,870 Hivyo ina idadi ya kwanza na kisha alphabetically kwa mzunguko. 183 00:14:13,870 --> 00:14:18,520 Kisha nini napenda kufanya ni Ningependa kujua chini 2. Hiyo 0 na 5. 184 00:14:18,520 --> 00:14:22,390 Napenda jumla yao, na kwamba ni 2. Kisha napenda kuendelea, kupata ijayo 2 chini. 185 00:14:22,390 --> 00:14:26,100 Wale ni 1s mbili, kisha wale kuwa 2 vilevile. 186 00:14:26,100 --> 00:14:31,570 Sasa najua kwamba hatua yangu ya pili ni kwenda kujiunga na idadi ya chini, 187 00:14:31,570 --> 00:14:41,380 ambayo ni T, 1, na kisha kuchagua moja ya nodes kwamba ana 2 kama mzunguko. 188 00:14:41,380 --> 00:14:44,560 Hivyo hapa sisi kuwa chaguzi 3. 189 00:14:44,560 --> 00:14:47,980 Nini mimi kwenda kufanya kwa slide ni tu kuibua upya yao kwa ajili yenu 190 00:14:47,980 --> 00:14:51,790 hivyo kwamba unaweza kuona jinsi mimi nina kujenga it up. 191 00:14:51,790 --> 00:14:59,040 Nini code na usambazaji yako code ni kwenda kufanya itakuwa kujiunga moja T 192 00:14:59,040 --> 00:15:01,410 na node 0 na 5. 193 00:15:01,410 --> 00:15:05,060 Hivyo basi, kwamba kiasi kwa 3, na kisha tunaendelea mchakato. 194 00:15:05,060 --> 00:15:08,660 2 na 2 sasa ni ya chini, hivyo basi wale Jumla ya 4. 195 00:15:08,660 --> 00:15:12,560 Kila mtu kufuatia hadi sasa? Sawa. 196 00:15:12,560 --> 00:15:16,410 Kisha baada ya kuwa tuna 3 na 3 ambayo yanahitaji kuongezwa juu, 197 00:15:16,410 --> 00:15:21,650 hivyo tena Mimi tu byte hivyo kwamba unaweza kuona kuibua hivyo kwamba hana kupata pia messy. 198 00:15:21,650 --> 00:15:25,740 Kisha sisi kuwa 6, na kisha hatua yetu ya mwisho ni kwamba sasa sisi tu nodes 2 199 00:15:25,740 --> 00:15:30,440 sisi jumla wale kufanya mizizi ya mti yetu, ambayo ni 10. 200 00:15:30,440 --> 00:15:34,100 Na namba 10 mantiki kwa sababu kila node kuwakilishwa, 201 00:15:34,100 --> 00:15:40,750 thamani yao, frequency yao idadi, ilikuwa ni mara ngapi alionekana katika kamba, 202 00:15:40,750 --> 00:15:46,350 na kisha tuna wahusika 5 katika kamba yetu, hivyo kwamba hufanya akili. 203 00:15:48,060 --> 00:15:52,320 Kama sisi kuangalia hadi saa jinsi sisi ingekuwa kweli encode yake, 204 00:15:52,320 --> 00:15:56,580 kama ilivyotarajiwa, i na s, ambayo kuonekana mara nyingi 205 00:15:56,580 --> 00:16:01,350 ni kuwakilishwa na idadi fewest ya bits. 206 00:16:03,660 --> 00:16:05,660 >> Kuwa makini hapa. 207 00:16:05,660 --> 00:16:09,780 Katika miti Huffman kesi kweli mambo. 208 00:16:09,780 --> 00:16:13,670 S uppercase ni tofauti kuliko s lowercase. 209 00:16:13,670 --> 00:16:21,260 Kama tulikuwa na "Hii ni CS50" kwa herufi kubwa, basi s lowercase ingekuwa tu kuonekana mara mbili, 210 00:16:21,260 --> 00:16:27,120 itakuwa ya nodi 2 kama thamani yake, na kisha uppercase S itakuwa na mara moja. 211 00:16:27,120 --> 00:16:33,440 Hivyo basi mti yako ingekuwa kubadilisha miundo kwa sababu wewe kweli kuwa jani ziada hapa. 212 00:16:33,440 --> 00:16:36,900 Lakini Jumla bado ingekuwa 10. 213 00:16:36,900 --> 00:16:39,570 Hiyo tulichokuwa kwenda kuwa wito checksum, 214 00:16:39,570 --> 00:16:44,060 Aidha wote wa makosa. 215 00:16:46,010 --> 00:16:50,990 >> Sasa kwa kuwa tumekuwa kufunikwa miti Huffman, tunaweza kupiga mbizi katika Huff'n Puff, pset. 216 00:16:50,990 --> 00:16:52,900 Sisi ni kwenda kuanza na sehemu ya maswali, 217 00:16:52,900 --> 00:16:57,990 na hii ni kwenda kupata Wanahudhuria na miti binary na jinsi ya kufanya kazi ya kuzunguka kwamba: 218 00:16:57,990 --> 00:17:03,230 kuchora nodes, kujenga typedef yako mwenyewe struct kwa nodi, 219 00:17:03,230 --> 00:17:07,230 na kuona jinsi ya unavyoweza kuingiza ndani ya mti binary, moja hiyo Iliyopangwa, 220 00:17:07,230 --> 00:17:09,050 traversing yake, na vitu kama hivyo. 221 00:17:09,050 --> 00:17:14,560 Kwamba elimu ni dhahiri kwenda kukusaidia wakati wewe kupiga mbizi katika sehemu Puff Huff'n 222 00:17:14,560 --> 00:17:17,089 ya pset. 223 00:17:19,150 --> 00:17:26,329 Katika toleo la kiwango cha pset, kazi yako ni kutekeleza Puff, 224 00:17:26,329 --> 00:17:30,240 na katika toleo hacker kazi yako ni kutekeleza Huff. 225 00:17:30,240 --> 00:17:38,490 Nini Huff gani ni inachukua asilia na basi hutafsiriwa kwenye sekunde 0 na 1s, 226 00:17:38,490 --> 00:17:41,990 hivyo mchakato kwamba sisi tulikuwa juu ambapo sisi kuhesabiwa frekvenser 227 00:17:41,990 --> 00:17:50,970 na kisha alifanya mti na kisha akasema, "Je, mimi kupata T?" 228 00:17:50,970 --> 00:17:54,840 T ni kuwakilishwa na 100, mambo kama hayo, 229 00:17:54,840 --> 00:17:58,860 na kisha Huff bila kuchukua asilia na kisha pato kwamba binary. 230 00:17:58,860 --> 00:18:04,920 Lakini pia kwa sababu tunajua kwamba tunataka kuruhusu mpokeaji wa ujumbe wetu 231 00:18:04,920 --> 00:18:11,790 recreate exact mti, pia pamoja na taarifa kuhusu makosa frequency. 232 00:18:11,790 --> 00:18:17,980 Kisha kwa Puff tumepewa faili binary ya sekunde 0 na 1s 233 00:18:17,980 --> 00:18:21,740 na kupewa pia taarifa kuhusu masafa. 234 00:18:21,740 --> 00:18:26,740 Sisi kutafsiri yote ya nyuma wale sekunde 0 na 1s katika ujumbe wa awali kwamba alikuwa, 235 00:18:26,740 --> 00:18:29,350 hivyo sisi ni decompressing kwamba. 236 00:18:29,350 --> 00:18:36,450 Kama wewe ni kufanya toleo la kawaida, huna haja ya kutekeleza Huff, 237 00:18:36,450 --> 00:18:39,290 hivyo basi unaweza kutumia tu utekelezaji wafanyakazi wa Huff. 238 00:18:39,290 --> 00:18:42,080 Kuna katika spec maelekezo ya jinsi ya kufanya hivyo. 239 00:18:42,080 --> 00:18:48,780 Unaweza kukimbia utekelezaji wafanyakazi wa Huff juu ya faili fulani Nakala 240 00:18:48,780 --> 00:18:53,270 na kisha kutumia pato kama mchango wako kwa Puff. 241 00:18:53,270 --> 00:18:59,330 >> Kama nilivyoeleza hapo awali, tuna mengi ya maadili ya usambazaji kwa hii moja. 242 00:18:59,330 --> 00:19:01,810 Mimi naenda kuanza kwenda kwa njia hiyo. 243 00:19:01,810 --> 00:19:04,400 Mimi naenda kutumia zaidi ya muda juu ya h files. 244 00:19:04,400 --> 00:19:07,660 kwa sababu katika c. files, kwa sababu tuna h. 245 00:19:07,660 --> 00:19:11,650 na kwamba hutoa sisi na prototypes ya utendaji, 246 00:19:11,650 --> 00:19:15,520 hatuwezi kikamilifu haja ya kuelewa hasa - 247 00:19:15,520 --> 00:19:20,280 Kama huelewi nini kinaendelea katika files. C, basi si wasiwasi sana, 248 00:19:20,280 --> 00:19:23,600 lakini dhahiri kujaribu kuangalia kwa sababu inaweza kutoa mwanga baadhi 249 00:19:23,600 --> 00:19:29,220 na ni muhimu kupata kutumika kusoma code ya watu wengine. 250 00:19:38,940 --> 00:19:48,270 >> Kuangalia huffile.h, katika maoni inatangaza safu ya uchukuaji kwa files Huffman-coded. 251 00:19:48,270 --> 00:20:01,660 Kama sisi kwenda chini, tunaona kwamba kuna upeo wa ishara 256 tupate haja codes kwa. 252 00:20:01,660 --> 00:20:05,480 Hii ni pamoja na barua zote za alfabeti - kubwa na ndogo - 253 00:20:05,480 --> 00:20:08,250 na kisha alama na namba, nk 254 00:20:08,250 --> 00:20:11,930 Basi hapa tuna idadi uchawi kutambua faili Huffman-coded. 255 00:20:11,930 --> 00:20:15,890 Ndani ya code Huffman wao wanaenda kuwa baadhi ya uchawi idadi 256 00:20:15,890 --> 00:20:18,560 kuhusishwa na header. 257 00:20:18,560 --> 00:20:21,110 Hii inaweza kuangalia kama idadi tu random uchawi, 258 00:20:21,110 --> 00:20:27,160 lakini kama kweli kutafsiri katika ASCII, basi ni kweli inayoyataja Huff. 259 00:20:27,160 --> 00:20:34,290 Hapa tuna struct kwa faili Huffman-encoded. 260 00:20:34,290 --> 00:20:39,670 Kuna sifa zote hizi zinazohusiana na faili Huff. 261 00:20:39,670 --> 00:20:47,080 Kisha chini hapa tuna header kwa faili Huff, hivyo tunasema Huffeader 262 00:20:47,080 --> 00:20:50,810 badala ya kuongeza h ziada kwa sababu inaonekana sawa anyway. 263 00:20:50,810 --> 00:20:52,720 Cute. 264 00:20:52,720 --> 00:20:57,790 Tuna idadi uchawi yanayohusiana na hayo. 265 00:20:57,790 --> 00:21:09,040 Kama ni halisi Huff faili, itakuja kuwa idadi up hapo juu, hii moja uchawi. 266 00:21:09,040 --> 00:21:14,720 Na kisha itakuwa na safu. 267 00:21:14,720 --> 00:21:18,750 Hivyo kwa mfano kila, ambapo kuna 256, 268 00:21:18,750 --> 00:21:24,760 itakavyo waorodheshe kile frequency ya alama hizo ni ndani ya faili Huff. 269 00:21:24,760 --> 00:21:28,090 Na kisha hatimaye, tuna checksum kwa masafa, 270 00:21:28,090 --> 00:21:32,160 ambayo inapaswa kuwa Jumla ya masafa hayo. 271 00:21:32,160 --> 00:21:36,520 Hivyo kwamba ni nini Huffeader ni. 272 00:21:36,520 --> 00:21:44,600 Kisha sisi kuwa baadhi ya majukumu ya kuwa kurudi kidogo ijayo katika faili Huff 273 00:21:44,600 --> 00:21:52,580 kama vile anaandika kidogo na faili Huff, na kisha hii kazi hapa, hfclose, 274 00:21:52,580 --> 00:21:54,650 kwamba kweli kufunga faili Huff. 275 00:21:54,650 --> 00:21:57,290 Kabla ya hapo, tulikuwa kushughulika na moja kwa moja tu fclose, 276 00:21:57,290 --> 00:22:01,190 lakini wakati una faili Huff, badala ya fclosing ni 277 00:22:01,190 --> 00:22:06,080 kile wewe ni kweli kwenda kufanya ni hfclose na hfopen yake. 278 00:22:06,080 --> 00:22:13,220 Wale ni maalum kwa kazi files Huff kwamba sisi ni kwenda kuwa kushughulika na. 279 00:22:13,220 --> 00:22:19,230 Ndipo hapa tunasoma katika header na kisha kuandika header. 280 00:22:19,230 --> 00:22:25,700 >> Tu kwa kusoma h. Faili tunaweza aina ya kupata hisia ya kile faili Huff ili kuwa, 281 00:22:25,700 --> 00:22:32,480 nini sifa ina, bila ya kweli kwenda katika huffile.c, 282 00:22:32,480 --> 00:22:36,750 ambayo, kama sisi kupiga mbizi katika, kinaenda kuwa kidogo ngumu zaidi. 283 00:22:36,750 --> 00:22:41,270 Ina wote wa faili I / O hapa kushughulika na kuyatumia. 284 00:22:41,270 --> 00:22:48,010 Hapa tunaona kwamba wakati sisi kuwaita hfread, kwa mfano, ni bado kushughulika na fread. 285 00:22:48,010 --> 00:22:53,050 Sisi siyo ya kuepuka kupata kazi hizo kabisa, lakini sisi ni kutuma wale kuchukuliwa huduma ya 286 00:22:53,050 --> 00:22:59,760 ndani ya faili Huff badala ya kufanya yote ya wenyewe. 287 00:22:59,760 --> 00:23:02,300 Unaweza kujisikia huru kwa Scan kupitia hii kama wewe ni curious 288 00:23:02,300 --> 00:23:08,410 na kwenda na peel safu nyuma kidogo. 289 00:23:20,650 --> 00:23:24,060 >> faili ijayo kwamba sisi ni kwenda kuangalia ni tree.h. 290 00:23:24,060 --> 00:23:30,210 Kabla katika walkthrough slides sisi alisema tunatarajia nodi Huffman 291 00:23:30,210 --> 00:23:32,960 na sisi alifanya typedef struct nodi. 292 00:23:32,960 --> 00:23:38,360 Tunatarajia kuwa na alama, frequency, na kisha nyota 2 nodi. 293 00:23:38,360 --> 00:23:41,870 Katika kesi hii ni nini sisi ni kufanya ni hii kimsingi ni sawa 294 00:23:41,870 --> 00:23:46,880 isipokuwa badala ya nodi tunakwenda kuwaita miti. 295 00:23:48,790 --> 00:23:56,760 Tuna kazi kwamba wakati wewe piga kufanya mti kuirudisha wewe pointer mti. 296 00:23:56,760 --> 00:24:03,450 Nyuma kwa Speller, wakati walikuwa maamuzi nodi mpya 297 00:24:03,450 --> 00:24:11,410 wewe alisema nodi * mpya neno = malloc (sizeof) na vitu kama hivyo. 298 00:24:11,410 --> 00:24:17,510 Kimsingi, mktree ni kwenda kukabiliana na kwamba kwa ajili yenu. 299 00:24:17,510 --> 00:24:20,990 Vile vile, wakati unataka kuondoa mti, 300 00:24:20,990 --> 00:24:24,810 hivyo hiyo kimsingi kumkomboa mti wakati wewe ni kosa na hilo, 301 00:24:24,810 --> 00:24:33,790 badala ya kupanga wito bure juu ya kwamba, wewe ni kweli tu kwenda kutumia kazi rmtree 302 00:24:33,790 --> 00:24:40,360 ambapo unaweza kupita katika pointer mti na kisha tree.c itachukua huduma ya kwamba kwa ajili yenu. 303 00:24:40,360 --> 00:24:42,490 >> Sisi kuangalia katika tree.c. 304 00:24:42,490 --> 00:24:47,240 Tunatarajia kazi sawa isipokuwa kuona utekelezaji pia. 305 00:24:47,240 --> 00:24:57,720 Kama sisi ilivyotarajiwa, wakati wewe piga mktree ni mallocs ukubwa wa mti katika pointer, 306 00:24:57,720 --> 00:25:03,190 initializes wote wa maadili na thamani null, hivyo sekunde 0 au NULLs, 307 00:25:03,190 --> 00:25:08,280 na kisha anarudi pointer mti kwamba ve tu malloc'd na wewe. 308 00:25:08,280 --> 00:25:13,340 Hapa wakati wewe piga kuondoa mti ni ya kwanza hufanya uhakika kwamba wewe si mara mbili kumkomboa. 309 00:25:13,340 --> 00:25:18,320 Ni hufanya kuhakikisha kwamba kwa kweli kuwa na mti kwamba unataka kuondoa. 310 00:25:18,320 --> 00:25:23,330 Hapa kwa sababu mti pia ni pamoja na watoto wake, 311 00:25:23,330 --> 00:25:29,560 nini hii haina ni recursively wito kuondoa mti juu ya nodi ya kushoto ya mti 312 00:25:29,560 --> 00:25:31,650 kama vile nodi haki. 313 00:25:31,650 --> 00:25:37,790 Kabla frees mzazi, inahitaji huru watoto pia. 314 00:25:37,790 --> 00:25:42,770 Mzazi ni pia interchangeable na mizizi. 315 00:25:42,770 --> 00:25:46,500 kwanza milele mzazi, hivyo kama kubwa-kubwa-kubwa-kubwa-babu 316 00:25:46,500 --> 00:25:52,130 au bibi mti, kwanza tuna huru chini ngazi ya kwanza. 317 00:25:52,130 --> 00:25:58,490 Hivyo tembeeni hadi chini, bure hizo, na kisha kuja nyuma juu, bure hizo, nk 318 00:26:00,400 --> 00:26:02,210 Basi hiyo ni mti. 319 00:26:02,210 --> 00:26:04,240 >> Sasa tunaangalia msitu. 320 00:26:04,240 --> 00:26:09,860 Msitu ni mahali ambapo yote ya miti yako Huffman. 321 00:26:09,860 --> 00:26:12,910 Ni kusema kwamba sisi itawabidi kitu kinachoitwa njama 322 00:26:12,910 --> 00:26:22,320 kwamba ina pointer mti kama vile pointer njama iitwayo ijayo. 323 00:26:22,320 --> 00:26:28,480 Nini muundo gani hii aina ya kuangalia kama? 324 00:26:29,870 --> 00:26:32,490 Ni aina ya anasema ni zaidi ya hapo. 325 00:26:34,640 --> 00:26:36,700 Haki zaidi ya hapa. 326 00:26:37,340 --> 00:26:39,170 orodha zinazoungwa. 327 00:26:39,170 --> 00:26:44,590 Tunaona kwamba wakati tuna njama ni kama orodha ya viwanja wanaohusishwa. 328 00:26:44,590 --> 00:26:53,020 msitu hufafanuliwa kama orodha ya viwanja wanaohusishwa, 329 00:26:53,020 --> 00:26:58,100 na hivyo muundo wa misitu ni sisi ni kwenda tu kuwa pointer njama wetu wa kwanza 330 00:26:58,100 --> 00:27:02,740 na njama kwamba ina mti ndani yake au tuseme pointi kwa mti 331 00:27:02,740 --> 00:27:06,190 na kisha anasema kwa njama ijayo, kadhalika na kadhalika. 332 00:27:06,190 --> 00:27:11,100 Kufanya msitu tunaita mkforest. 333 00:27:11,100 --> 00:27:14,930 Kisha sisi kuwa baadhi ya majukumu muhimu pretty hapa. 334 00:27:14,930 --> 00:27:23,240 Tuna pick ambapo unaweza kupita katika msitu na kisha kurudi thamani ni * Tree, 335 00:27:23,240 --> 00:27:25,210 pointer mti. 336 00:27:25,210 --> 00:27:29,370 Nini pick kufanya itakuwa ni kwenda msituni kwamba wewe ni akizungumzia 337 00:27:29,370 --> 00:27:35,240 kisha kuondoa mti na frequency chini kutoka msitu kwamba 338 00:27:35,240 --> 00:27:38,330 na kisha kukupa pointer mti. 339 00:27:38,330 --> 00:27:43,030 Mara baada ya kuwaita pick, mti haipo katika msitu tena, 340 00:27:43,030 --> 00:27:48,550 lakini thamani ya kurudi ni pointer mti. 341 00:27:48,550 --> 00:27:50,730 Kisha una kupanda. 342 00:27:50,730 --> 00:27:57,420 Isipokuwa kwamba wewe kupita katika pointer mti ambao frequency zisizo 0, 343 00:27:57,420 --> 00:28:04,040 nini kupanda kufanya ni itachukua msitu, kuchukua mti, na kupanda mti huo ndani ya msitu. 344 00:28:04,040 --> 00:28:06,370 Hapa tuna rmforest. 345 00:28:06,370 --> 00:28:11,480 Sawa na kuondoa mti, ambayo kimsingi huru yote ya miti yetu kwa ajili yetu, 346 00:28:11,480 --> 00:28:16,600 kuondoa msitu mapenzi bure kila kitu zilizomo katika msitu huo. 347 00:28:16,600 --> 00:28:24,890 >> Kama sisi kuangalia ndani forest.c, tutaweza wanatarajia kuona angalau 1 rmtree amri huko, 348 00:28:24,890 --> 00:28:30,090 kwa sababu kwa kumbukumbu bure katika msitu kama misitu ina miti katika hilo, 349 00:28:30,090 --> 00:28:32,930 kisha hatimaye utaenda kuwa na kuondoa miti wale pia. 350 00:28:32,930 --> 00:28:41,020 Kama sisi kuangalia ndani forest.c, tuna mkforest yetu, ambayo ni kama sisi kutarajia. 351 00:28:41,020 --> 00:28:42,890 Sisi malloc mambo. 352 00:28:42,890 --> 00:28:51,740 Sisi initialize njama kwanza katika msitu kama null sababu ni tupu kwa kuanzia, 353 00:28:51,740 --> 00:29:05,940 kisha sisi kuona pick, ambayo anarudi mti na uzito chini, frequency ya chini, 354 00:29:05,940 --> 00:29:13,560 na kisha anapata kuondoa nodi fulani kwamba pointi kwa mti huo, na moja ijayo, 355 00:29:13,560 --> 00:29:16,760 hivyo inachukua kwamba nje ya orodha wanaohusishwa ya msitu. 356 00:29:16,760 --> 00:29:24,510 Na kisha hapa tuna mmea ambao kuwekeza katika orodha mti zinazoungwa. 357 00:29:24,510 --> 00:29:29,960 Nini msitu gani ni nicely anaendelea kuwa sorted kwa ajili yetu. 358 00:29:29,960 --> 00:29:37,910 Na kisha hatimaye, tuna rmforest na, kama ilivyotarajiwa, tuna rmtree kuitwa huko. 359 00:29:46,650 --> 00:29:55,440 >> Kuangalia code usambazaji hadi sasa, huffile.c labda kwa mbali gumu kuelewa, 360 00:29:55,440 --> 00:29:59,990 ambapo files nyingine wenyewe walikuwa pretty rahisi kufuata. 361 00:29:59,990 --> 00:30:03,090 Pamoja na elimu yetu ya kuyatumia na orodha zilizounganishwa na vile, 362 00:30:03,090 --> 00:30:04,860 tulikuwa na uwezo wa kufuata pretty vizuri. 363 00:30:04,860 --> 00:30:10,500 Lakini yote tunahitaji kweli kuhakikisha kwamba sisi kuelewa ni h. Files 364 00:30:10,500 --> 00:30:15,840 kwa sababu unahitaji kuwa wito kazi hizo, kukabiliana na maadili hayo ya kurudi, 365 00:30:15,840 --> 00:30:20,590 ili kuhakikisha kwamba wewe kuelewa nini action anaenda kuwa walifanya 366 00:30:20,590 --> 00:30:24,290 wakati wowote wewe piga moja ya kazi hizo. 367 00:30:24,290 --> 00:30:33,020 Lakini kwa kweli kuelewa ndani yake si muhimu kabisa kwa sababu tuna wale h files.. 368 00:30:35,170 --> 00:30:39,490 Tuna files 2 zaidi kushoto katika usambazaji code yetu. 369 00:30:39,490 --> 00:30:41,640 >> Hebu tuangalie dampo. 370 00:30:41,640 --> 00:30:47,230 Dampo kwa maoni yake hapa inachukua faili Huffman-USITUMIE 371 00:30:47,230 --> 00:30:55,580 na kisha hutafsiriwa na madampo wote wa maudhui yake nje. 372 00:31:01,010 --> 00:31:04,260 Hapa tunaona kuwa ni wito hfopen. 373 00:31:04,260 --> 00:31:10,770 Hii ni aina ya mirroring na faili * pembejeo = fopen, 374 00:31:10,770 --> 00:31:13,500 na kisha kupita katika taarifa. 375 00:31:13,500 --> 00:31:18,240 Ni karibu kufanana isipokuwa badala ya * faili wewe ni kupita katika Huffile; 376 00:31:18,240 --> 00:31:22,030 badala ya fopen wewe ni kupita katika hfopen. 377 00:31:22,030 --> 00:31:29,280 Hapa tunasoma katika header ya kwanza, ambayo ni aina ya sawa na jinsi sisi kusoma katika header 378 00:31:29,280 --> 00:31:33,580 kwa ajili ya faili bitmap. 379 00:31:33,580 --> 00:31:38,000 Nini sisi ni kufanya hapa ni kuangalia ili kuona kama taarifa header 380 00:31:38,000 --> 00:31:44,330 ina haki ya uchawi idadi ambayo inaonyesha kuwa ni halisi Huff faili, 381 00:31:44,330 --> 00:31:53,610 basi wote wa hundi hizo kuhakikisha kwamba faili kwamba sisi ni wazi halisi huffed faili au la. 382 00:31:53,610 --> 00:32:05,330 Nini hii ni matokeo ya masafa ya wote wa ishara kwamba tunaweza kuona 383 00:32:05,330 --> 00:32:09,790 ndani ya terminal katika meza graphical. 384 00:32:09,790 --> 00:32:15,240 Sehemu hii ni kwenda kuwa na manufaa. 385 00:32:15,240 --> 00:32:24,680 Ina kidogo na wasomaji kidogo kidogo katika kidogo kutofautiana na kisha Prints nje. 386 00:32:28,220 --> 00:32:35,430 Hivyo kama mimi walikuwa kuwaita dampo kwenye hth.bin, ambayo ni matokeo ya huffing faili 387 00:32:35,430 --> 00:32:39,490 kutumia ufumbuzi wafanyakazi, napenda kupata hii. 388 00:32:39,490 --> 00:32:46,000 Ni outputting yote ya wahusika hawa na kisha kuweka frequency ambayo wao kuonekana. 389 00:32:46,000 --> 00:32:51,180 Tukiangalia, wengi wao ni sekunde 0 ila kwa hili: H, ambayo inaonekana mara mbili, 390 00:32:51,180 --> 00:32:54,820 na kisha T, ambayo inaonekana mara moja. 391 00:32:54,820 --> 00:33:07,860 Na kisha hapa tuna ujumbe halisi katika sekunde 0 na 1s. 392 00:33:07,860 --> 00:33:15,450 Tukiangalia hth.txt, ambayo ni huenda ikatengeneza ujumbe wa awali kwamba alikuwa huffed, 393 00:33:15,450 --> 00:33:22,490 tunatarajia kuona baadhi HS na Ts huko. 394 00:33:22,490 --> 00:33:28,720 Hasa, tunatarajia kuona T 1 tu na 2 HS. 395 00:33:32,510 --> 00:33:37,440 Hapa sisi ni katika hth.txt. Ni kweli ana HTH. 396 00:33:37,440 --> 00:33:41,270 Pamoja katika huko, ingawa hatuwezi kuona hivyo, ni tabia newline. 397 00:33:41,270 --> 00:33:53,190 Faili Huff hth.bin pia usimbaji tabia newline pia. 398 00:33:55,680 --> 00:34:01,330 Hapa kwa sababu tunajua kwamba ili ni HTH na kisha newline, 399 00:34:01,330 --> 00:34:07,340 tunaweza kuona kwamba pengine H ni kuwakilishwa na tu 1 moja 400 00:34:07,340 --> 00:34:17,120 na kisha T pengine ni 01 na kisha H ijayo ni kama 1 vizuri 401 00:34:17,120 --> 00:34:21,139 na kisha tuna newline unahitajika kwa sekunde 0 mbili. 402 00:34:22,420 --> 00:34:24,280 Cool. 403 00:34:26,530 --> 00:34:31,600 >> Na kisha hatimaye, kwa sababu sisi ni kushughulika na mbalimbali c. Na. H files, 404 00:34:31,600 --> 00:34:36,350 sisi itawabidi pretty tata hoja compiler, 405 00:34:36,350 --> 00:34:40,460 na hivyo hapa tuna Makefile kwamba inafanya dampo kwa ajili yenu. 406 00:34:40,460 --> 00:34:47,070 Lakini kwa kweli, una kwenda juu ya kufanya puff.c yako mwenyewe faili. 407 00:34:47,070 --> 00:34:54,330 Makefile kweli haina kukabiliana na maamuzi puff.c kwa ajili yenu. 408 00:34:54,330 --> 00:34:59,310 Sisi ni kuacha kuwa hadi wewe hariri Makefile. 409 00:34:59,310 --> 00:35:05,930 Unapoingia amri kama kufanya yote, kwa mfano, itafanya wote kwa ajili yenu. 410 00:35:05,930 --> 00:35:10,760 Jisikie huru kuangalia mifano ya Makefile kutoka pset zamani 411 00:35:10,760 --> 00:35:17,400 kama vile kwenda mbali ya hii moja kuona jinsi unaweza kuwa na uwezo wa kufanya Puff faili yako 412 00:35:17,400 --> 00:35:20,260 kwa kuhariri hii Makefile. 413 00:35:20,260 --> 00:35:22,730 Hiyo ni kuhusu hilo kwa ajili ya usambazaji code yetu. 414 00:35:22,730 --> 00:35:28,380 >> Mara tumekuwa Gotten kupitia njia hiyo, basi hapa tu mwingine ukumbusho 415 00:35:28,380 --> 00:35:30,980 ya jinsi sisi ni kwenda kuwa kushughulika na nodes Huffman. 416 00:35:30,980 --> 00:35:35,400 Sisi siyo kwenda kuwa kuwaita nodes tena; tunakwenda kuwa kuwaita miti 417 00:35:35,400 --> 00:35:39,260 ambapo sisi mtaenda anayewakilisha alama yao na Char, 418 00:35:39,260 --> 00:35:43,340 frequency yao, idadi ya matukio, na integer. 419 00:35:43,340 --> 00:35:47,370 Sisi ni kutumia kwamba kwa sababu ni sahihi zaidi kuliko kuelea. 420 00:35:47,370 --> 00:35:52,980 Na kisha sisi kuwa na mwingine pointer mtoto wa kushoto kama vile mtoto wa kulia. 421 00:35:52,980 --> 00:35:59,630 msitu, kama tulivyoona, ni tu orodha zilizounganishwa ya miti. 422 00:35:59,630 --> 00:36:04,670 Hatimaye, wakati sisi ni kujenga wetu Huff faili, 423 00:36:04,670 --> 00:36:07,580 tunataka msitu wetu na vyenye tu 1 mti - 424 00:36:07,580 --> 00:36:12,420 1 mti, 1 mizizi na watoto mbalimbali. 425 00:36:12,420 --> 00:36:20,840 Mapema tulipokuwa tu maamuzi yetu miti Huffman, 426 00:36:20,840 --> 00:36:25,360 sisi ilianza nje kwa kuweka yote ya nodi kwenye screen zetu 427 00:36:25,360 --> 00:36:27,790 na kusema sisi itawabidi nodi hiyo, 428 00:36:27,790 --> 00:36:32,920 hatimaye wao wanaenda kuwa majani, na hii ni alama yao, hii ni ya mzunguko yao. 429 00:36:32,920 --> 00:36:42,070 Katika msitu wetu ikiwa sisi tu barua 3, hiyo ni msitu wa miti 3. 430 00:36:42,070 --> 00:36:45,150 Na kisha kama sisi kwenda juu, wakati sisi aliongeza mzazi wa kwanza, 431 00:36:45,150 --> 00:36:48,080 sisi alifanya msitu wa miti 2. 432 00:36:48,080 --> 00:36:54,930 Sisi kuondolewa 2 ya watoto wale kutoka msitu wetu na kisha nafasi yake kuchukuliwa na nodi mzazi 433 00:36:54,930 --> 00:36:58,820 kwamba alikuwa nodes wale 2 kama watoto. 434 00:36:58,820 --> 00:37:05,600 Na kisha hatimaye, hatua yetu ya mwisho na kufanya mfano wetu na Kama, Bs, na Cs 435 00:37:05,600 --> 00:37:08,030 itakuwa kufanya mzazi wa mwisho, 436 00:37:08,030 --> 00:37:13,190 na hivyo basi ambayo kuleta kuhesabu wetu jumla ya miti katika msitu wa 1. 437 00:37:13,190 --> 00:37:18,140 Je, kila mtu kuona jinsi gani kuanza nje na miti mbalimbali katika msitu yako 438 00:37:18,140 --> 00:37:22,520 na kuishia na 1? Sawa. Cool. 439 00:37:25,530 --> 00:37:28,110 >> Nini tunahitaji kufanya kwa Puff? 440 00:37:28,110 --> 00:37:37,110 Tunachohitaji kufanya ni kuhakikisha kwamba, kama siku zote, wao kutupatia haki ya aina ya pembejeo 441 00:37:37,110 --> 00:37:39,090 ili tuweze kweli kuendesha programu. 442 00:37:39,090 --> 00:37:43,130 Katika kesi hiyo wao wanaenda kuwa anatupa baada ya hoja yao ya kwanza ya mstari amri 443 00:37:43,130 --> 00:37:53,440 2 zaidi: faili kwamba tunataka decompress na pato la faili decompressed. 444 00:37:53,440 --> 00:38:00,410 Lakini mara sisi kuhakikisha kwamba kupita kwetu katika kiasi cha haki ya maadili, 445 00:38:00,410 --> 00:38:05,820 tunataka kuhakikisha kwamba pembejeo ni faili Huff au la. 446 00:38:05,820 --> 00:38:10,420 Na kisha mara moja sisi kuhakikisha kwamba ni faili Huff, basi tunataka kujenga mti wetu, 447 00:38:10,420 --> 00:38:20,940 kujenga mti vile kwamba mechi mti kwamba mtu ambaye alimtuma ujumbe kujengwa. 448 00:38:20,940 --> 00:38:25,840 Kisha baada ya sisi kujenga mti, basi tunaweza kukabiliana na, sekunde 0 na 1s kwamba wao kupita katika 449 00:38:25,840 --> 00:38:29,590 kufuata wale pamoja mti wetu kwa sababu ni sawa, 450 00:38:29,590 --> 00:38:33,510 na kisha kuandika kwamba ujumbe nje, kutafsiri bits nyuma katika chars. 451 00:38:33,510 --> 00:38:35,880 Na kisha mwishoni kwa sababu sisi ni kushughulika na kuyatumia hapa, 452 00:38:35,880 --> 00:38:38,110 tunataka kuhakikisha kwamba hatuna uvujaji yoyote kumbukumbu 453 00:38:38,110 --> 00:38:41,330 na kwamba sisi bure kila kitu. 454 00:38:42,820 --> 00:38:46,430 >> Kuhakikisha matumizi sahihi ni mzee kofia kwa ajili yetu kwa sasa. 455 00:38:46,430 --> 00:38:51,980 Sisi kuchukua katika pembejeo, ambayo ni kwenda kuwa jina la faili puff, 456 00:38:51,980 --> 00:38:56,010 na kisha sisi taja pato, 457 00:38:56,010 --> 00:39:01,580 hivyo jina la faili kwa ajili ya pato majivuno, ambayo itakuwa faili asilia. 458 00:39:03,680 --> 00:39:08,820 Hiyo ni matumizi. Na sasa tunataka kuhakikisha kwamba pembejeo ni huffed au la. 459 00:39:08,820 --> 00:39:16,420 Kufikiri nyuma, kulikuwa na chochote katika usambazaji code ambayo yanaweza kutusaidia 460 00:39:16,420 --> 00:39:21,570 na kuelewa kama faili ni huffed au la? 461 00:39:21,570 --> 00:39:26,910 Kulikuwa na taarifa katika huffile.c kuhusu Huffeader. 462 00:39:26,910 --> 00:39:33,430 Tunajua kwamba kila faili Huff ina Huffeader yanayohusiana na hayo na idadi uchawi 463 00:39:33,430 --> 00:39:37,240 kama vile array ya masafa kwa alama ya kila 464 00:39:37,240 --> 00:39:39,570 kama vile checksum. 465 00:39:39,570 --> 00:39:43,180 Tunajua kwamba, lakini sisi pia alichukua Peek saa dump.c, 466 00:39:43,180 --> 00:39:49,120 ambayo ilitolewa kusoma ndani ya faili Huff. 467 00:39:49,120 --> 00:39:53,990 Na hivyo kufanya kuwa, alikuwa na kuangalia kama ni kweli alikuwa huffed au la. 468 00:39:53,990 --> 00:40:03,380 Hivyo labda tunaweza kutumia dump.c kama muundo kwa puff.c. wetu 469 00:40:03,380 --> 00:40:12,680 Rudi pset 4 wakati tulikuwa copy.c faili kwamba kunakiliwa katika triples RGB 470 00:40:12,680 --> 00:40:14,860 na sisi kufasiriwa kuwa kwa Whodunit na resize, 471 00:40:14,860 --> 00:40:20,390 vile vile, nini unaweza kufanya ni kukimbia tu amri kama linganisha dump.c puff.c 472 00:40:20,390 --> 00:40:23,600 na kutumia baadhi ya maadili ya huko. 473 00:40:23,600 --> 00:40:28,210 Hata hivyo, si kwenda kuwa kama moja kwa moja ya mchakato 474 00:40:28,210 --> 00:40:33,010 kwa kutafsiri dump.c yako katika puff.c, 475 00:40:33,010 --> 00:40:36,160 lakini angalau ni inakupa mahali fulani kuanza 476 00:40:36,160 --> 00:40:40,540 juu ya jinsi ya kuhakikisha kuwa pembejeo ni kweli au si huffed 477 00:40:40,540 --> 00:40:43,240 kama vile wachache na mambo mengine. 478 00:40:45,930 --> 00:40:50,250 Sisi kuhakikisha matumizi sahihi na kuhakikisha kwamba pembejeo ni huffed. 479 00:40:50,250 --> 00:40:53,570 Kila wakati kwamba tumefanya kwamba tumefanya makosa yetu sahihi kuangalia, 480 00:40:53,570 --> 00:41:01,520 hivyo kurudi na kuacha kazi kama kushindwa baadhi hutokea, kama kuna tatizo. 481 00:41:01,520 --> 00:41:07,170 >> Sasa nini tunataka kufanya ni kujenga mti halisi. 482 00:41:08,840 --> 00:41:12,640 Tukiangalia katika Msitu, kuna kazi kuu 2 483 00:41:12,640 --> 00:41:15,800 kwamba sisi ni kwenda wanataka kuwa familiar sana na. 484 00:41:15,800 --> 00:41:23,870 Kuna Boolean kazi kupanda kwamba mimea yasiyo 0 frequency mti ndani ya msitu wetu. 485 00:41:23,870 --> 00:41:29,250 Na hivyo kuna kupita katika pointer msitu na pointer mti. 486 00:41:32,530 --> 00:41:40,340 Quick swali: Jinsi wengi misitu una wakati wewe ni kujenga mti Huffman? 487 00:41:44,210 --> 00:41:46,650 Msitu yetu ni kama canvas yetu, haki? 488 00:41:46,650 --> 00:41:50,800 Hivyo sisi ni kwenda tu kuwa 1 msitu, lakini sisi itawabidi miti mbalimbali. 489 00:41:50,800 --> 00:41:57,590 Basi, kabla ya kuwaita kupanda, wewe labda anaenda kutaka kufanya msitu yako. 490 00:41:57,590 --> 00:42:04,430 Kuna amri kwa kuwa kama ukiangalia katika forest.h juu ya jinsi gani unaweza kufanya msitu. 491 00:42:04,430 --> 00:42:09,270 Unaweza kupanda miti. Tunajua jinsi ya kufanya hivyo. 492 00:42:09,270 --> 00:42:11,590 Na kisha unaweza pia kuchukua mti kutokana na msitu, 493 00:42:11,590 --> 00:42:17,540 kuondoa mti na uzito chini na kutoa pointer kwamba. 494 00:42:17,540 --> 00:42:23,090 Kufikiri nyuma tulipokuwa kufanya mifano wenyewe, 495 00:42:23,090 --> 00:42:27,980 tulipokuwa kuchora ni nje, sisi tu tu aliongeza viungo. 496 00:42:27,980 --> 00:42:31,680 Lakini hapa badala ya kuongeza tu viungo, 497 00:42:31,680 --> 00:42:40,630 kufikiria zaidi kama wewe ni kuondoa 2 ya nodes hizo na kisha kuondoa na mwingine mmoja. 498 00:42:40,630 --> 00:42:44,200 Kueleza kwamba katika suala la kuokota na kupanda, 499 00:42:44,200 --> 00:42:48,840 wewe ni kuokota miti 2 na kisha kupanda mti mwingine 500 00:42:48,840 --> 00:42:54,060 ambayo ina miti wale 2 kwamba wewe ilichukua kama watoto. 501 00:42:57,950 --> 00:43:05,280 Kujenga mti Huffman, unaweza kusoma katika alama na frekvenser ili 502 00:43:05,280 --> 00:43:10,790 kwa sababu Huffeader anatoa kwamba na wewe, 503 00:43:10,790 --> 00:43:14,250 inakupa safu ya masafa. 504 00:43:14,250 --> 00:43:19,660 Hivyo unaweza kwenda mbele na kupuuzia tu na chochote 0 ndani yake 505 00:43:19,660 --> 00:43:23,760 kwa sababu hatutaki majani 256 katika mwisho wake. 506 00:43:23,760 --> 00:43:27,960 Sisi tu wanataka idadi ya majani ambayo ni herufi 507 00:43:27,960 --> 00:43:31,600 kwamba ni kweli kutumika katika faili. 508 00:43:31,600 --> 00:43:37,590 Unaweza kusoma katika ishara hizo, na kila moja ya alama za wale ambao frekvenser zisizo 0, 509 00:43:37,590 --> 00:43:40,440 wale ni kwenda kuwa miti. 510 00:43:40,440 --> 00:43:45,990 Nini unaweza kufanya ni kila wakati kusoma katika ishara zisizo 0 frequency, 511 00:43:45,990 --> 00:43:50,660 unaweza kupanda mti huo katika msitu. 512 00:43:50,660 --> 00:43:56,620 Mara baada ya kupanda miti katika msitu, unaweza kujiunga miti wale kama ndugu, 513 00:43:56,620 --> 00:44:01,130 hivyo kurejea kupanda na kuokota ambapo unaweza kuchukua 2 na kisha kupanda 1, 514 00:44:01,130 --> 00:44:05,820 ambapo kwamba 1 kwamba kupanda ni mzazi wa watoto 2 kwamba wewe ilichukua. 515 00:44:05,820 --> 00:44:11,160 Hivyo basi mwisho wako matokeo ni kwenda kuwa mti mmoja katika msitu yako. 516 00:44:16,180 --> 00:44:18,170 Hiyo ni jinsi ya kujenga mti yako. 517 00:44:18,170 --> 00:44:21,850 >> Kuna mambo kadhaa ambayo inaweza kwenda vibaya hapa 518 00:44:21,850 --> 00:44:26,580 kwa sababu sisi ni kushughulika na kufanya miti mipya na kushughulika na kuyatumia na mambo kama hayo. 519 00:44:26,580 --> 00:44:30,450 Kabla tulipokuwa kushughulika na kuyatumia, 520 00:44:30,450 --> 00:44:36,580 wakati sisi malloc'd sisi alitaka kuhakikisha kwamba hawakuwa turudisha null pointer thamani. 521 00:44:36,580 --> 00:44:42,770 Hivyo katika hatua kadhaa ndani ya mchakato huu, kutakuwa na kuwa kadhaa kesi 522 00:44:42,770 --> 00:44:45,920 ambapo programu yako inaweza kushindwa. 523 00:44:45,920 --> 00:44:51,310 Nini unataka kufanya ni wewe unataka kuhakikisha kwamba wewe kushughulikia makosa hayo, 524 00:44:51,310 --> 00:44:54,580 na katika spec inasema kushughulikia yao gracefully, 525 00:44:54,580 --> 00:45:00,280 hivyo kama magazeti ujumbe kwa mtumiaji kuwaambia nini mpango ina kuacha 526 00:45:00,280 --> 00:45:03,050 na kisha mara moja kuacha yake. 527 00:45:03,050 --> 00:45:09,490 Ili kufanya hivi utunzaji makosa, kumbuka kwamba unataka kuangalia ni 528 00:45:09,490 --> 00:45:12,160 kila wakati kwamba kuna inaweza kuwa kushindwa. 529 00:45:12,160 --> 00:45:14,660 Kila wakati kwamba wewe ni kufanya pointer mpya 530 00:45:14,660 --> 00:45:17,040 wewe unataka kuhakikisha kwamba hiyo ni mafanikio. 531 00:45:17,040 --> 00:45:20,320 Kabla ya kile sisi kutumika kufanya ni kufanya pointer mpya na malloc yake, 532 00:45:20,320 --> 00:45:22,380 na kisha tunataka kuangalia kama pointer kwamba ni null. 533 00:45:22,380 --> 00:45:25,670 Hivyo kuna ni kwenda kuwa baadhi ya mifano ambapo unaweza tu kufanya hivyo, 534 00:45:25,670 --> 00:45:28,610 lakini wakati mwingine wewe ni kweli wito kazi 535 00:45:28,610 --> 00:45:33,100 na ndani ya kazi kwamba, hiyo ni moja kwamba anafanya mallocing. 536 00:45:33,100 --> 00:45:39,110 Katika kesi hiyo, kama sisi kuangalia nyuma kwa baadhi ya kazi ndani ya kificho, 537 00:45:39,110 --> 00:45:42,260 baadhi yao ni Boolean kazi. 538 00:45:42,260 --> 00:45:48,480 Katika kesi ya kufikirika kama tuna kazi Boolean kuitwa foo, 539 00:45:48,480 --> 00:45:54,580 kimsingi, tunaweza kudhani kwamba kwa kuongeza katika kufanya chochote foo gani, 540 00:45:54,580 --> 00:45:57,210 tangu ni kazi Boolean, kuirudisha kweli au uongo - 541 00:45:57,210 --> 00:46:01,300 kweli kama mafanikio, ya uongo kama si. 542 00:46:01,300 --> 00:46:06,270 Hivyo tunataka kuangalia kama thamani ya kurudi kwa foo ni kweli au uongo. 543 00:46:06,270 --> 00:46:10,400 Kama ni ya uongo, hiyo ina maana kwamba sisi ni kwenda kutaka magazeti baadhi ya aina ya ujumbe 544 00:46:10,400 --> 00:46:14,390 na kisha kuacha mpango. 545 00:46:14,390 --> 00:46:18,530 Nini tunataka kufanya ni kuangalia thamani ya kurudi kwa foo. 546 00:46:18,530 --> 00:46:23,310 Kama foo anarudi uongo, basi tunajua kwamba sisi wamekutana baadhi ya aina ya kosa 547 00:46:23,310 --> 00:46:25,110 na sisi haja ya kujiondoa programu yetu. 548 00:46:25,110 --> 00:46:35,600 njia ya kufanya hili ni kuwa na hali ambapo kazi halisi yenyewe ni hali yako. 549 00:46:35,600 --> 00:46:39,320 Sema foo inachukua katika x. 550 00:46:39,320 --> 00:46:43,390 Tunaweza kuwa kama hali kama (foo (x)). 551 00:46:43,390 --> 00:46:50,900 Kimsingi, hiyo ina maana kama katika mwisho wa utekelezaji foo kuirudisha kweli, 552 00:46:50,900 --> 00:46:57,390 basi tunaweza kufanya kazi hii kwa sababu ina kutathmini foo 553 00:46:57,390 --> 00:47:00,500 ili kutathmini hali nzima. 554 00:47:00,500 --> 00:47:06,500 Hivyo basi, kwamba ni jinsi gani wanaweza kufanya kitu kama kazi anarudi kweli na ni mafanikio. 555 00:47:06,500 --> 00:47:11,800 Lakini wakati uko makosa ya kuangalia, wewe tu unataka kuacha kazi yako kama anarudi uongo. 556 00:47:11,800 --> 00:47:16,090 Nini unaweza kufanya ni kuongeza tu == uongo au kuongeza tu bang mbele yake 557 00:47:16,090 --> 00:47:21,010 na kisha una ikiwa (! foo). 558 00:47:21,010 --> 00:47:29,540 Ndani ya kwamba mwili wa hali ya kuwa bila kuwa na aina ya utunzaji makosa, 559 00:47:29,540 --> 00:47:36,940 hivyo kama, "Haikuweza kuunda mti huu" na kisha kurudi 1 au kitu kama hicho. 560 00:47:36,940 --> 00:47:43,340 Nini kwamba gani, ingawa, ni kwamba hata ingawa foo akarudi uongo - 561 00:47:43,340 --> 00:47:46,980 Sema foo anarudi kweli. 562 00:47:46,980 --> 00:47:51,060 Kisha huna kuwaita foo tena. Hiyo ni kawaida mbaya. 563 00:47:51,060 --> 00:47:54,730 Kwa sababu ilikuwa katika hali yako, ni tayari tathmini, 564 00:47:54,730 --> 00:47:59,430 hivyo tayari kuwa na matokeo kama unatumia kufanya mti au kitu kama hicho 565 00:47:59,430 --> 00:48:01,840 au mmea au pick au kitu. 566 00:48:01,840 --> 00:48:07,460 Ni kwamba tayari ina thamani. Ni tayari kunyongwa. 567 00:48:07,460 --> 00:48:10,730 Hivyo ni muhimu kwa kutumia kazi Boolean kama hali 568 00:48:10,730 --> 00:48:13,890 kwa sababu kama au wewe kweli nitafanya mwili wa kitanzi, 569 00:48:13,890 --> 00:48:18,030 ni executes kazi anyway. 570 00:48:22,070 --> 00:48:27,330 >> Pili yetu hadi hatua ya mwisho ni kuandika ujumbe kwa faili. 571 00:48:27,330 --> 00:48:33,070 Mara sisi kujenga mti Huffman, kisha kuandika ujumbe kwa faili ni pretty moja kwa moja. 572 00:48:33,070 --> 00:48:39,260 Ni pretty moja kwa moja sasa ili tu kufuata sekunde 0 na 1s. 573 00:48:39,260 --> 00:48:45,480 Na hivyo kwa mkataba tunajua kwamba katika mti Huffman sekunde 0 zinaonyesha kushoto 574 00:48:45,480 --> 00:48:48,360 na 1s zinaonyesha haki. 575 00:48:48,360 --> 00:48:53,540 Hivyo basi kama wewe kusoma katika kidogo kidogo, kila wakati kwamba kupata 0 576 00:48:53,540 --> 00:48:59,100 utasikia kufuata tawi kushoto, na kisha kila wakati wewe kusoma katika 1 577 00:48:59,100 --> 00:49:02,100 utaenda kufuata tawi haki. 578 00:49:02,100 --> 00:49:07,570 Na kisha utaenda kuendelea mpaka hit jani 579 00:49:07,570 --> 00:49:11,550 kwa sababu majani ni kwenda kuwa katika mwisho wa matawi. 580 00:49:11,550 --> 00:49:16,870 Tunawezaje kujua kama tumekuwa hit jani au la? 581 00:49:19,800 --> 00:49:21,690 Sisi alisema ni kabla. 582 00:49:21,690 --> 00:49:24,040 [Mwanafunzi] Kama ni kuyatumia null. >> Yeah. 583 00:49:24,040 --> 00:49:32,220 Tunaweza kusema kama tumekuwa hit jani kama kuyatumia kwa miti yote ya kushoto na kulia ni null. 584 00:49:32,220 --> 00:49:34,110 Perfect. 585 00:49:34,110 --> 00:49:40,320 Tunajua kwamba sisi unataka kusoma katika kidogo kidogo ndani ya faili wetu Huff. 586 00:49:43,870 --> 00:49:51,220 Kama tulivyoona mbele katika dump.c, walichofanya ni wao kusoma katika kidogo kidogo ndani ya faili Huff 587 00:49:51,220 --> 00:49:54,560 na tu kuchapishwa nini wale bits walikuwa. 588 00:49:54,560 --> 00:49:58,430 Sisi siyo kwenda kufanya hiyo. Sisi ni kwenda kufanya kitu ambacho ni kidogo ngumu zaidi. 589 00:49:58,430 --> 00:50:03,620 Lakini nini tunaweza kufanya ni kwamba tunaweza kuchukua kidogo ya kificho kwamba anasoma katika kidogo. 590 00:50:03,620 --> 00:50:10,250 Hapa tuna kidogo integer anayewakilisha kidogo sasa kwamba sisi ni juu. 591 00:50:10,250 --> 00:50:15,520 Hii inachukua huduma ya iterating wote wa bits katika faili mpaka hit mwisho wa faili. 592 00:50:15,520 --> 00:50:21,270 Kulingana na kwamba, basi wewe ni kwenda kutaka kuwa na aina fulani ya iterator 593 00:50:21,270 --> 00:50:26,760 kwa traverse mti yako. 594 00:50:26,760 --> 00:50:31,460 Na kisha kuzingatia kama ni kidogo 0 au 1, 595 00:50:31,460 --> 00:50:36,920 wewe ni kwenda kutaka ama hoja kwamba iterator wa kushoto au hoja hiyo kwa haki 596 00:50:36,920 --> 00:50:44,080 njia yote mpaka hit jani, hivyo njia yote hadi kuwa nodi kwamba wewe ni juu ya 597 00:50:44,080 --> 00:50:48,260 haina uhakika na nodes yoyote zaidi. 598 00:50:48,260 --> 00:50:54,300 Kwa nini tunaweza kufanya pamoja na faili Huffman lakini si Morse code? 599 00:50:54,300 --> 00:50:56,610 Kwa sababu katika code Morse kuna utata kidogo. 600 00:50:56,610 --> 00:51:04,440 Sisi inaweza kuwa kama, oh kusubiri, tumekuwa hit barua njiani, hivyo labda hii ni barua yetu, 601 00:51:04,440 --> 00:51:08,150 lakini kama sisi iliendelea tu kidogo tena, basi sisi ingekuwa hit barua nyingine. 602 00:51:08,150 --> 00:51:13,110 Lakini si kwamba kitatokea katika encoding Huffman, 603 00:51:13,110 --> 00:51:17,540 hivyo tunaweza mapumziko uhakika kwamba njia pekee ya kwamba sisi ni kwenda hit tabia 604 00:51:17,540 --> 00:51:23,480 ni kama kwamba nodi ya kushoto na kulia ni watoto null. 605 00:51:28,280 --> 00:51:32,350 >> Hatimaye, tunataka huru yote ya kumbukumbu zetu. 606 00:51:32,350 --> 00:51:37,420 Tunataka wote karibu faili Huff kwamba sisi tumekuwa kushughulika na 607 00:51:37,420 --> 00:51:41,940 kama vile kuondoa yote ya miti katika msitu wetu. 608 00:51:41,940 --> 00:51:46,470 Kulingana na utekelezaji wako, wewe pengine anaenda kutaka kuwaita kuondoa msitu 609 00:51:46,470 --> 00:51:49,780 badala ya kweli kwenda njia zote za miti mwenyewe. 610 00:51:49,780 --> 00:51:53,430 Lakini kama wewe alifanya miti yoyote ya muda, utasikia wanataka huru kwamba. 611 00:51:53,430 --> 00:51:59,060 Unajua code yako bora, hivyo unajua ambapo wewe ni kugawa kumbukumbu. 612 00:51:59,060 --> 00:52:04,330 Na hivyo kama wewe kwenda katika, kuanza kwa hata Document F'ing kwa malloc, 613 00:52:04,330 --> 00:52:08,330 kuona wakati wewe malloc na kuhakikisha kuwa ninyi huru yote ya kwamba 614 00:52:08,330 --> 00:52:10,190 lakini basi tu kwenda kwa code yako, 615 00:52:10,190 --> 00:52:14,260 kuelewa ambapo unaweza kuwa zilizotengwa kumbukumbu. 616 00:52:14,260 --> 00:52:21,340 Kawaida unaweza kusema tu, "Wakati wa mwisho wa faili Mimi tu kwenda kuondoa misitu katika msitu yangu," 617 00:52:21,340 --> 00:52:23,850 hivyo kimsingi wazi kwamba kumbukumbu, bure kwamba, 618 00:52:23,850 --> 00:52:28,310 "Na kisha Mimi pia naenda kuifunga faili na kisha mpango wangu ni kwenda kuacha." 619 00:52:28,310 --> 00:52:33,810 Lakini ni kwamba wakati tu kwamba mpango wako quits? 620 00:52:33,810 --> 00:52:37,880 Hapana, kwa sababu wakati mwingine huenda kuna wamekuwa makosa yaliyotokea. 621 00:52:37,880 --> 00:52:42,080 Labda tunaweza kufungua faili au hatukuweza kufanya mwingine mti 622 00:52:42,080 --> 00:52:49,340 au aina fulani ya makosa yaliyotokea katika mchakato mgao kumbukumbu na hivyo wakarudi null. 623 00:52:49,340 --> 00:52:56,710 makosa yaliyotokea na kisha sisi akarudi na kuacha. 624 00:52:56,710 --> 00:53:02,040 Hivyo basi wewe unataka kuhakikisha kwamba wakati wowote inawezekana kwamba mpango wako wanaweza kujiondoa, 625 00:53:02,040 --> 00:53:06,980 unataka kumwondolea yote ya kumbukumbu yako huko. 626 00:53:06,980 --> 00:53:13,370 Siyo tu kwenda kuwa katika mwisho sana ya kazi kuu ya kuwa wewe kujiondoa code yako. 627 00:53:13,370 --> 00:53:20,780 Unataka kuangalia nyuma kwa mfano kila kwamba code yako uwezekano ili kurudi mapema 628 00:53:20,780 --> 00:53:25,070 na kisha bure chochote kumbukumbu hufanya akili. 629 00:53:25,070 --> 00:53:30,830 Sema ametuita kufanya msitu na kwamba alirudi uongo. 630 00:53:30,830 --> 00:53:34,230 Basi pengine si haja ya kuondoa msitu yako 631 00:53:34,230 --> 00:53:37,080 kwa sababu wewe huna msitu bado. 632 00:53:37,080 --> 00:53:42,130 Lakini katika kila hatua katika code ambapo unaweza kurudi mapema 633 00:53:42,130 --> 00:53:46,160 unataka kuhakikisha kuwa wewe huru yoyote kumbukumbu iwezekanavyo. 634 00:53:46,160 --> 00:53:50,020 >> Hivyo wakati sisi ni kushughulika na kumkomboa kumbukumbu na kuwa na uvujaji uwezo, 635 00:53:50,020 --> 00:53:55,440 tunataka si tu kutumia hukumu yetu na mantiki zetu 636 00:53:55,440 --> 00:54:01,850 lakini pia kutumia Valgrind kuamua kama tumekuwa huru yote ya kumbukumbu zetu vizuri au la. 637 00:54:01,850 --> 00:54:09,460 Unaweza ama kukimbia Valgrind juu Puff na kisha una pia kupita 638 00:54:09,460 --> 00:54:14,020 idadi ya haki ya hoja amri ya mstari Valgrind. 639 00:54:14,020 --> 00:54:18,100 Unaweza kukimbia, lakini pato ni kidogo cryptic. 640 00:54:18,100 --> 00:54:21,630 Tumekuwa Gotten kidogo kutumika kwa Speller, lakini bado tunahitaji msaada zaidi kidogo, 641 00:54:21,630 --> 00:54:26,450 hivyo basi mbio na bendera chache zaidi kama leak-kuangalia = kamili, 642 00:54:26,450 --> 00:54:32,040 kwamba pengine kutupa baadhi ya pato zaidi ya kuwasaidia kwenye Valgrind. 643 00:54:32,040 --> 00:54:39,040 >> Kisha mwingine ncha muhimu wakati wewe ni debugging ni amri tofauti. 644 00:54:39,040 --> 00:54:48,520 Unaweza kufikia utekelezaji wafanyakazi wa Huff, kukimbia kwamba faili maandishi, 645 00:54:48,520 --> 00:54:55,400 na kisha pato kwa faili binary, binary Huff SVG, kuwa maalum. 646 00:54:55,400 --> 00:54:59,440 Kisha kama wewe kukimbia Puff yako mwenyewe kwenye faili kwamba binary, 647 00:54:59,440 --> 00:55:03,950 basi walau, maandishi yako ya faili outputted ni kwenda kuwa kufanana 648 00:55:03,950 --> 00:55:08,200 kwa moja ya awali kwamba wewe kupita in 649 00:55:08,200 --> 00:55:15,150 Hapa mimi nina kutumia hth.txt kama mfano, na hiyo ni moja kuongelea katika spec yako. 650 00:55:15,150 --> 00:55:21,040 Hiyo ni literally tu HTH na kisha newline. 651 00:55:21,040 --> 00:55:30,970 Lakini dhahiri kujisikia huru na wewe ni dhahiri wanahimizwa kutumia mifano tena 652 00:55:30,970 --> 00:55:32,620 Nakala kwa faili yako. 653 00:55:32,620 --> 00:55:38,110 >> Unaweza hata kuchukua risasi saa labda compressing na kisha decompressing 654 00:55:38,110 --> 00:55:41,600 baadhi ya files kwamba unaweza kutumika katika Speller kama Vita na Amani 655 00:55:41,600 --> 00:55:46,710 au Jane Austen au kitu kama hicho - kwamba itakuwa aina ya baridi - au Powers Austin, 656 00:55:46,710 --> 00:55:51,880 aina ya kushughulika na faili kubwa kwa sababu sisi bila kuja chini kwa hiyo 657 00:55:51,880 --> 00:55:55,590 kama sisi kutumika chombo ijayo hapa, ls-l. 658 00:55:55,590 --> 00:56:01,150 Tuliyoizoea ls, ambayo kimsingi unaorodhesha yaliyomo yote katika saraka wetu wa sasa. 659 00:56:01,150 --> 00:56:07,860 Kupita katika l flag-kweli maonyesho ukubwa wa mafaili ya wale. 660 00:56:07,860 --> 00:56:12,690 Kama kwenda kwa njia spec pset, ni kweli anatembea wewe kwa njia ya kuunda faili binary, 661 00:56:12,690 --> 00:56:16,590 ya huffing, na unaweza kuona kwamba kwa files ndogo sana 662 00:56:16,590 --> 00:56:23,910 gharama nafasi ya compressing yake na kutafsiri taarifa zote kwamba 663 00:56:23,910 --> 00:56:26,980 ya yote frekvenser na mambo kama hayo outweighs faida halisi 664 00:56:26,980 --> 00:56:30,000 ya compressing faili katika nafasi ya kwanza. 665 00:56:30,000 --> 00:56:37,450 Lakini kama wewe kukimbia juu ya baadhi ya faili maandishi marefu, basi unaweza kuona kwamba kuanza kupata baadhi ya faida 666 00:56:37,450 --> 00:56:40,930 katika compressing files wale. 667 00:56:40,930 --> 00:56:46,210 >> Na kisha hatimaye, tuna pal wetu wa kale GDB, ambayo ni dhahiri kwenda kuja katika Handy pia. 668 00:56:48,360 --> 00:56:55,320 >> Je, tuna maswali yoyote juu ya miti Huff au mchakato labda ya kufanya miti 669 00:56:55,320 --> 00:56:58,590 au maswali yoyote juu ya nyingine Puff Huff'n? 670 00:57:00,680 --> 00:57:02,570 Sawa. Mimi itabidi kukaa kote kwa kidogo. 671 00:57:02,570 --> 00:57:06,570 >> Shukrani, kila mtu. Hii ilikuwa walkthrough 6. Na bahati nzuri. 672 00:57:08,660 --> 00:57:10,000 >> [CS50.TV]