[Powered by Google Translate] [Walkthrough - مسئلہ 6 سیٹ] [Zamyla چان - ہارورڈ یونیورسٹی] یہ [CS50 ہے. CS50.TV] - خوش، سب، اور 6 Walkthrough کا خیر مقدم: Huff'n پف. Huff'n پف میں جو ہم کر رہے ہیں وہ Huffman کمپریسڈ فائل سے نمٹنے جا رہا ہے اور پھر یہ puffing بیک اپ، تو یہ پھیلانا، تاکہ ہم 0s اور 1s کہ صارف بھیجتا سے ترجمہ کر سکتے ہیں اور اس کے اصل متن میں واپس تبدیل کریں. Pset 6 کافی ٹھنڈا ہو جائے گا کیونکہ آپ کو ٹولز میں سے کچھ کو دیکھنے کے لئے جا رہے ہیں ہے کہ آپ کو 1 بہت صاف تصور میں انہیں شامل کرنے کے 4 pset اور 5 pset اور قسم میں استعمال کیا جب آپ اس کے بارے میں سوچنے کے لئے آئے ہیں. کے علاوہ، arguably، 4 اور 5 pset کے سب سے زیادہ مشکل psets کہ ہم کرنے کی پیشکش کی تھی. تو اب سے، ہم سی 1 pset ہے، اور پھر ہم اس کے بعد ویب پروگرامنگ پر ہیں. تو اپنے CS50 میں سب سے مشکل کوبڑ پر حاصل کرنے کے لئے مبارک باد دیتا ہوں. کو Huff'n پف کے لئے منتقل، اس pset کے لئے ہماری آلات Huffman درخت کے لئے جا رہے ہیں، ایسا ہے، تو نہ صرف کس طرح بائنری درخت بلکہ کام خاص طور پر Huffman درختوں کو سمجھنے وہ کس طرح تعمیر کر رہے ہیں. اور پھر ہم اس pset میں تقسیم کے کوڈ کا ایک بہت ہے کے لئے جا رہے ہیں، اور ہم اصل میں یہ دیکھ کوڈ کے کچھ آئے گا ہم مکمل طور پر ابھی تک سمجھنے کے قابل نہیں ہو سکتا ہے، لہذا ان سی فائلوں.، لیکن اس وقت ان کے ساتھ فائلیں. H ہمیں تفہیم کے لئے کافی ہے کہ ہمیں ضرورت ہے تا کہ ہم جانتے ہیں کہ کس طرح ان افعال کا کام دے گا یا کم از کم جو وہ کرنا چاہئے ہیں - ان کے آدانوں اور نتائج - ہم بھی اگر آپ نہیں جانتے کہ بلیک باکس میں کیا ہو رہا ہے سمجھ یا نہیں کیا کے اندر اندر بلیک باکس میں کیا ہو رہا ہے. اور پھر آخر میں، ہمیشہ کی طرح، ہم نئے اعداد و شمار کے ڈھانچے کے ساتھ دوچار ہیں، کے مخصوص قسم کے نوڈس کہ کچھ چیزوں کی طرف اشارہ ہے، اور اس وجہ سے یہاں نہ صرف ڈیزائن کے عمل کے لئے ایک قلم اور کاغذ اور جب آپ کو معلوم کرنا آپ کا pset کس طرح کام کرنا چاہئے کی کوشش کر رہے ہیں بلکہ بگ کے دوران. آپ کو آپ کے قلم اور کاغذ کے ساتھ ساتھ GDB جب تم کیا اقدار ہیں کر سکتے ہیں، آپ کے تیر کی طرف اشارہ کرتے ہوئے جہاں، کر رہے ہیں اور اس طرح کی چیزیں. پہلے Huffman درختوں کو دیکھو. Huffman درخت بائنری درخت ہیں، کا مطلب یہ ہے کہ ہر نوڈ کو صرف 2 بچے ہیں. Huffman درختوں میں خصوصیت ہے کہ سب سے زیادہ بار بار اقدار fewest بٹس کی طرف سے نمائندگی کی. ہم مورس کوڈ کے لیکچر کے مثال کے طور پر، انوائسز کی طرح ہے جو کچھ خط میں دیکھا. اگر آپ مثال کے طور پر ایک یا ایک ای کا ترجمہ کرنے کی کوشش کر رہے ہیں، آپ اکثر کہ ترجمہ کر رہے ہیں، تو بجائے اس کے کہ بٹس کی مکمل سیٹ کو استعمال کرنے کے لئے کہ ہمیشہ کی طرح ڈیٹا کی قسم کے لیے مختص ہیں، آپ اسے کم کمپریس نیچے، اور پھر ان خطوط جو کی نمائندگی کر رہے ہیں کم اکثر طویل بٹس کے ساتھ نمائندگی کر رہے ہیں کیونکہ آپ نے برداشت جب آپ باہر تعدد ہے کہ ان خطوط ظاہر وزن کر سکتے ہیں. ہم Huffman درختوں میں ایک ہی خیال ہے یہاں ہم کہاں کر رہے ہیں، چین کے راستے کی ایک قسم ہے کہ مخصوص حروف حاصل کرنے کے لئے. اور اس کے بعد جو سب سے زیادہ فریکوئنسی آنے والے حروف fewest بٹس کے ساتھ نمائندگی کر رہے ہیں کیا جا رہا ہے. طریقہ ہے کہ آپ کو ایک Huffman درخت تعمیر متن میں ظاہر ہونے والے حروف کے تمام رکھ کر ہے اور ان کی فریکوئنسی حساب، وہ کتنی بار دکھائے جاتے ہیں. یہ کتنی بار ان حروف کو ظاہر شمار یا تو ہو سکتا ہے یا شاید تمام حروف کتنے ہر ایک ظاہر ہوتا ہے سے باہر کا ایک فی صد ہے. اور اس وجہ سے جو تم کرتے ہو ہے ایک بار تم اس نقشے باہر کے سب تو آپ 2 سب سے کم تعدد کے لئے دیکھو اور اس کے بعد ان کے بہن بھائیوں کے طور پر اپنے ساتھ شامل ہونے کی تو جہاں والدین نوڈ تعدد ہے جو اس کے 2 بچوں کی رقم ہے ہے. اور کنونشن کی طرف سے تو آپ کا کہنا ہے کہ بائیں نوڈ، آپ 0 برانچ کے بعد کی طرف سے اس کی پیروی، اور پھر rightmost نوڈ 1 برانچ ہے. جیسا کہ ہم نے مورس کوڈ میں دیکھا، ایک پکڑ لیا تھا کہ اگر آپ کے پاس صرف ایک بیپ اور بیپ تھا یہ مبہم تھا. 1 خط یا یہ 2 حروف کی ترتیب ہو سکتی ہے ہو سکتا ہے. اور تو کیا Huffman درختوں کرتا ہے کیونکہ حروف کی نوعیت کی طرف سے یا ہماری آخری اصل برانچ پر گزشتہ نوڈس کے حروف - ہم ان کے پتے کے طور پر حوالہ دیتے ہیں - کے سامنے اس کی وجہ سے کوئی ابہام نہیں ہو سکتا کس خط کی شرائط آپ بٹس کی سیریز کے ساتھ ضابطہ کاری کریں کرنے کی کوشش کر رہے ہیں میں کیونکہ بٹس 1 خط کی نمائندگی کرتے ہیں کے ساتھ ساتھ کہیں ایک اور پورے خط آپ کا سامنا اور کوئی الجھن وہاں نہیں کریں گے. لیکن ہم مثال کے طور پر میں جانا ہے کہ آپ لوگ اصل میں دیکھ سکتے ہیں کریں گے کہ بجائے اس کے کہ ہم صرف آپ کو بتا رہا ہوں کہ یہ سچ ہے. Huffman درخت کی ایک سادہ مثال میں نظر ہے. میں یہاں ایک سٹرنگ ہے کہ 12 حروف طویل ہے ہے. میں کے طور پر، 6، گریڈ، اور کاوچ سرفنگ کے 2 4 ہے. میرا پہلا قدم شمار ہو گا. A کتنی بار دکھائی دیتا ہے؟ یہ سٹرنگ میں 4 بار ظاہر ہوتا ہے. B 6 بار ظاہر ہوتا ہے، اور C 2 مرتبہ ظاہر ہوتا ہے. ظاہر ہے، میں کہتا ہوں کہ میں B کا استعمال کرتے ہوئے سب سے زیادہ کثرت سے ہوں جا رہا ہوں، تو میں بٹس کی fewest تعداد، 0s اور 1s fewest تعداد کے ساتھ بی کی نمائندگی کرنا چاہتے ہیں. اور پھر میں نے بھی C 1s اور 0s کے سب سے زیادہ رقم کے طور پر کی ضرورت کی توقع کی جا رہی ہوں. پہلے کہ میں یہاں کیا میں نے تعدد کی شرائط کے لئے کی ترتیب صعودی ترتیب میں ان کے رکھ دیا ہے. ہم دیکھتے ہیں کہ C اور A، وہ ہمارے 2 سب سے کم تعدد ہیں. ہم نے والدین کی نوڈ کو تشکیل دیتے ہیں، اور اس کے والدین نوڈ اس کے ساتھ منسلک خط نہیں ہے، لیکن یہ تعدد، جو رقم ہے ہے. رقم 2 + 4، جس میں 6 ہے ہو جاتا ہے. پھر ہم بائیں شاخ پر عمل کریں. اگر ہم اس 6 نوڈ میں تھے، تو ہم 0 کی پیروی C پر حاصل کرنے کے لئے کریں گے اور پھر 1 A. حاصل کرنے کے لئے تو اب ہم نے 2 نوڈس ہے. ہم 6 قیمت ہوتا ہے اور پھر ہم بھی 6 قیمت کے ساتھ ایک نوڈ. اور اس طرح 2 ان لوگوں کو نہ صرف کم سے کم 2 بلکہ صرف 2 رہ گئے ہیں، تو ہم نے رقم 12 ہونے کے ساتھ ایک اور والدین کی طرف سے ان لوگوں میں شامل ہونے، ہے. تو یہاں ہم اپنے Huffman درخت ہے جہاں B حاصل کرنے کے لئے، 1 بٹ صرف ہو گی اور پھر ایک حاصل کرنے کے لئے، ہم 01 ہے اور تو C 00 رکھنے. تو ہم یہاں دیکھتے ہیں کہ بنیادی طور پر ہم نے یا تو 1 یا 2 بٹس کے ساتھ ان حروف کی نمائندگی کر رہے ہیں جہاں B، کے طور پر پیش گوئی کی ہے، کم از کم ہے. اور پھر ہم C زیادہ سے زیادہ ہے کی توقع تھی، لیکن اس طرح ایک چھوٹی سی Huffman درخت ہے، تو بھی درمیان میں کہیں کے خلاف 2 بٹس کی طرف سے ظاہر کیا جاتا ہے. Huffman درخت کی ایک اور عام مثال پر جانے کے لئے، کا کہنا ہے کہ آپ کو سٹرنگ ہے "ہیلو." جو تم کرتے ہو سب سے پہلے ہے، آپ کا کہنا ہے کہ کتنی بار H اس میں ظاہر کرتا ہے؟ H ظاہر ہوتا ہے ایک بار تو ای ظاہر ہوتا ہے ایک بار اور اس کے بعد ہم نے دو بار دکھائے جانے L ہے اور اے ایک بار دکھائے جانے. اور تو ہم امید کرتے ہیں جو خط بٹس کی کم از کم تعداد کی طرف سے نمائندگی ہے؟ [طالب علم] L. >> L. جی ہاں. L صحیح ہے. ہم L بٹس کی کم از کم تعداد کی طرف سے نمائندگی کی توقع کیونکہ L سٹرنگ میں سب سے زیادہ استعمال کیا جاتا ہے "ہیلو." میں اب کیا کرنے جا رہا ہوں ان مراکز کو اپنی طرف متوجہ ہے. 1 ہے، جس H، اور پھر دوسرے 1،، جس میں ای ہے اور پھر 1، جو اے - ابھی میں نے ان کی ترتیب میں ڈال رہا ہوں - اور پھر 2، جس میں ہے. پھر میں نے کا کہنا ہے کہ جس طرح سے ہے کہ میں نے ایک Huffman درخت تعمیر کم از کم تعدد کے ساتھ 2 نوڈس کو تلاش کرنے کے لئے ہے اور ان کے والدین کی نوڈ بنانے کے کی طرف سے بہن بھائیوں ہے. یہاں ہم سب سے کم تعدد کے ساتھ 3 نوڈس ہے. وہ 1 تمام ہو. لہذا ہم یہاں کا انتخاب کرتے ہیں جو ایک ہم پہلے سے منسلک کرنے جا رہے ہیں. چلو کا کہنا ہے کہ میں H اور ای کا انتخاب کریں. 1 کی رقم + 1 2 ہے، لیکن یہ نوڈ اس کے ساتھ منسلک خط نہیں ہے. یہ صرف قیمت کی ڈگری حاصل کی. اب ہم اگلے 2 سب سے کم تعدد میں دیکھو. وہ 2 اور 1 ہے. کہ یا تو 2 والوں کی، لیکن میں نے اس سے ایک کو منتخب کرنے کے لئے جا رہا ہوں سکتے ہیں. رقم ہے 3. اور پھر آخر میں، میں صرف 2 بائیں ہے، تو 5 ہو جاتا ہے. ، پھر یہاں، کے طور پر امید کی جاتی ہے، اگر میں اس کے لئے انکوڈنگ میں بھرتے ہیں 1s ہمیشہ صحیح برانچ اور 0s بائیں ایک ہیں. پھر ہم 2 کی طرف سے صرف 1 اور پھر تھوڑا اے کی طرف سے نمائندگی L ہے اور پھر 2 کی طرف سے ای اور پھر H 3 بٹس نیچے آتا ہے. تو آپ کو یہ پیغام منتقل "ہیلو" کی بجائے اصل حروف کا استعمال کرتے ہوئے کی طرف سے صرف 0s اور 1s. لیکن یاد رکھنا چاہیے کہ ہم نے کئی مقدمات میں ہمارے تعدد کے ساتھ تعلقات تھے. ہم یا تو H اور O پہلے شاید میں شمولیت اختیار کر سکتے ہیں. یا پھر بعد میں جب ہم 2 کی طرف سے نمائندگی L کے ساتھ ساتھ 2 کی طرف سے نمائندگی ایک میں شمولیت اختیار کی، ہم یا تو ایک سے منسلک کیا جا سکتا ہے ہے. اور اس لئے تم جب بھیجنے 0s اور 1s کہ اصل میں نہیں اس بات کی ضمانت ہے کہ وصول کنندہ کا حق بیٹ کے اپنے پیغام کو مکمل طور پر پڑھ سکتے ہیں کیونکہ وہ نہیں جانتے کہ جو فیصلہ تم نے ہو سکتا ہے. تو جب ہم Huffman سمپیڑن کے ساتھ کام کر رہے ہو، کسی نہ کسی طرح ہم کو ہمارے پیغام کے وصول کنندہ کو بتانا کہ کس طرح ہم نے فیصلہ کیا ہے - وہ کچھ قسم کی اضافی معلومات کے جاننے کی ضرورت ہے کمپریسڈ پیغام اس کے علاوہ ہے. وہ اصل میں جو درخت کی طرح لگتا ہے سمجھ کی ضرورت ہے، ہم اصل میں کس طرح ان کے فیصلے کی تھی. یہاں ہم صرف اصل شمار کی بنیاد پر مثال کے طور پر کر رہے تھے، لیکن کبھی کبھی آپ کو ایک Huffman درخت بھی ہو سکتا ہے تعدد کی بنیاد پر ہے جس میں خط دکھائے جاتے ہیں، اور یہ بالکل وہی عمل ہے. یہاں میں یہ فیصد یا ایک حصہ کی شرائط میں کا اظہار کر رہا ہوں، اور اس وجہ سے یہاں بالکل وہی بات ہے. میں 2 سب سے کم، ان کا خلاصہ یہ اگلے سب سے کم 2، ان خلاصہ تلاش جب تک میں ایک مکمل درخت ہے. اگرچہ ہم یہ کسی بھی طرح سے، جب ہم فی صد کے ساتھ کام کر رہے ہو کر سکتے ہیں، کہ بلکہ کا مطلب ہے کہ ہم چیزوں کو تقسیم کر رہے ہیں اور دشملو سے نمٹنے یا floats اگر ہم سر کے اعداد و شمار کے ڈھانچے کے بارے میں سوچ رہے ہیں. ہم floats کے بارے میں کیا جانتے ہیں؟ کیا ایک عام مسئلہ ہے جب ہم floats کے ساتھ کام کر رہے ہو؟ [طالب علم] Imprecise ریاضی. >> جی ہاں. Imprecision. چل نقاط imprecision کی وجہ سے اس pset کے لئے تا کہ ہم اس بات کو یقینی بنانے کے لئے ہے کہ ہم کسی بھی اقدار کو کھو نہ کرو، تو پھر ہم اصل میں شمار سے نمٹنے جا رہے ہیں. تو اگر آپ Huffman نوڈ کے بارے میں سوچو، اگر آپ کی ساخت پر واپس یہاں دیکھو، اگر آپ سبز ہیں دیکھو، یہ اس کے ساتھ منسلک تعدد ہے کے ساتھ ساتھ اس کی بائیں جانب ایک نوڈ کے طور پر اچھی طرح سے کے طور پر اس کے حق میں ایک نوڈ کی طرف اشارہ ہے. اور پھر سرخ ہیں وہاں بھی ان کے ساتھ منسلک کردار ہے. ہم نہیں کر رہے ہیں اور پھر والدین کو حتمی نوڈس کے لئے الگ الگ ہیں بنانے کے جو ہم پتے کے طور پر حوالہ دیتے ہیں، بلکہ وہ نل اقدار پڑے گا. ہر نوڈ کے لیے ہم نے ایک کردار علامت پڑے گا کہ کہ نوڈ کی نمائندگی کرتا ہے، پھر ایک تعدد کے طور پر ساتھ ساتھ اس کے بائیں کے ساتھ ساتھ بچے کو اس کے صحیح بچے پوائنٹر. پتے، جو کہ بہت ہی سب سے نیچے دیئے گئے ہیں، نوڈ اشارہ بھی ہوگا ، ان کے بائیں اور ان کا حق ہے، لیکن ان اقدار کو اصل نوڈس کی طرف اشارہ نہیں کر رہے ہیں کے بعد ان کی قیمت کیا ہو گی؟ >> [طالب علم]، اتارنا null. >>، اتارنا null. بالکل. یہ کہ آپ کس طرح floats میں تعدد کی نمائندگی کر سکتے ہیں کی ایک مثال ہے، لیکن ہم integers کے ساتھ اس کے ساتھ نمٹنے جا رہے ہیں، تو تمام میں نے کیا ہے کہ ڈیٹا کی قسم کو تبدیل کریں. تھوڑا سا ایک پیچیدہ مثال کے جانے دو لیکن اب کہ ہم نے سادہ والوں نے کیا ہے، یہ صرف ایک ہی عمل ہے. آپ کے 2 سب سے کم تعدد تلاش، تعدد خلاصہ اور یہ کہ اپنے والدین کی نوڈ کے نئے تعدد ہے، 1 برانچ کے ساتھ 0 برانچ اور حق کے ساتھ جو اس کے بعد اس کے بائیں طرف اشارہ ہے. اگر ہم سٹرنگ "یہ cs50 ہے،" ہے تو ہم شمار کتنی بار T ذکر ہے، H ذکر، میں، S، C، 5، 0. تو کیا میں یہاں کیا سرخ نوڈس میں صرف لگائے کے ساتھ ہے، میں نے کہا میں ان حروف کو اپنے درخت کے سب سے نیچے دیئے گئے آخر میں جا رہا ہوں. وہ پتیوں کی سب جا رہے ہیں. اس کے بعد میں نے کیا کیا ہے میں صعودی میں تعدد کی طرف سے ان کے مطابق، اور یہ اصل میں جس طرح سے کہ pset کوڈ اس سے فرق پڑتا ہے ہے تعدد کی طرف سے اس قسم کی اور پھر ترتیب حروف تہجی کے. تو اس تعداد میں سب سے پہلے اور اس کے بعد تعدد کی طرف سے ترتیب حروف تہجی کے ہے. تو کیا میں کروں گا میں 2 سب سے کم ملے گا. یہ 0 اور 5 ہے. میں انہیں خلاصہ، اور یہ کہ 2. پھر میں جاری کرے گا اگلے سب سے کم 2 تلاش. وہ دو 1s ہیں، اور پھر ان 2 بن ساتھ ساتھ. اب میں جانتا ہوں کہ میرا اگلا قدم سب سے کم تعداد میں شامل ہونے جا رہا ہے، جس T ہے، 1، اور پھر نوڈس جو تعدد کے طور پر 2 ہے ایک کا انتخاب ہے. لہذا ہم یہاں 3 اختیارات ہیں. میں سلائڈ کے لئے کیا کرنے جا رہا ہوں صرف آپ کے لئے نابینا ان پنرویوستیت تو تم نے دیکھا کہ کس طرح میں اس کی تعمیر کر رہا ہوں کر سکتے ہیں. کوڈ کیا اور اپنی تقسیم کوڈ کرنے والی ہے T ایک میں شامل ہونے گے 0 اور 5 نوڈ کے ساتھ. تو پھر ہے کہ 3 رقم، اور پھر ہم عمل جاری ہے. 2 اور 2 اب سب سے کم ہیں، تو پھر 4 ان رقم. ہر کوئی اتنی دور کے بعد؟ ٹھیک ہے. اس کے بعد ہم نے اس کے بعد 3 اور 3 کہ شامل کرنے کی ضرورت ہے ہے، تو پھر میں صرف سوئچنگ رہا ہوں تاکہ آپ ضعف تو دیکھتے ہیں کہ یہ بہت گندا حاصل نہیں کر سکتا. پھر ہم 6 ہے، اور پھر ہماری آخری مرحلہ ہے کہ ہم صرف 2 نوڈس ہے ہم ان ہمارے درخت، جس میں 10 ہے کی جڑ کو بنانے کے لئے خلاصہ. اور 10 نمبر سمجھ میں آتا ہے کیونکہ ہر نوڈ کی نمائندگی، ان کی قیمت، ان کے تعدد کی تعداد، کتنی بار وہ سٹرنگ میں شائع، اور پھر ہم اپنے سٹرنگ میں 5 حروف، جو سمجھ میں آتا ہے. اگر ہم نے کہ ہم کس طرح یہ اصل میں ضابطہ کاری کریں گے، دیکھو، کے طور پر امید کی جاتی ہے، میں نے اور S، جس میں سب سے زیادہ کثرت سے دکھائے بٹس کے fewest تعداد کی طرف سے نمائندگی کی. یہاں محتاط رہیں. Huffman درختوں میں بات واقعی فرق پڑتا ہے. ایک بڑے S ایک چھوٹے S سے مختلف ہے. اگر ہم نے "یہ CS50 ہے" بڑے حروف کے ساتھ، تو چھوٹے S میں دو بار ہی نظر آئے، اس کی قیمت کے طور پر 2 کے ساتھ ایک نوڈ، اور اس وقت کے بڑے S صرف ایک دفعہ ہی ہو گی. تو پھر آپ کا درخت ڈھانچے کو تبدیل کیونکہ آپ واقعی ایک اضافی پتی یہاں ہے. لیکن رقم 10 اب بھی ہو جائے گا. یہی ہے جو ہم واقعی حیض بلا رکھا جائے جا رہے ہیں، شمار کے سب کے علاوہ. اب کہ ہم نے Huffman درختوں کو احاطہ کرتا ہے، ہم کو Huff'n پف، pset میں کودو کر سکتے ہیں. ہم سوالات کے ایک حصے کے ساتھ شروع کرنے جا رہے ہیں، اور یہ آپ کو بائنری درختوں اور کس طرح کہ اس کے ارد گرد کام کرنے کے ساتھ عادی جا رہا ہے: ڈرائنگ نوڈس، ایک نوڈ کے لئے اپنا خود کا typedef struct پیدا اور دیکھ کر کس طرح آپ کو ایک بائنری درخت، ایک کے مطابق ہے میں داخل ہو سکتا ہے، ، اور اس طرح چیزوں traversing. وہ علم یقینی طور پر جب آپ Huff'n پف حصہ میں ڈوبکی کی مدد کی جا رہی ہے pset. pset کے سٹینڈرڈ ایڈیشن میں، آپ کے کام کو پف کو لاگو کرنے کے لئے ہے، اور ہیکر کے ورژن میں آپ کا کام Huff کو لاگو کرنے کے لئے ہے. Huff کیا ہے یہ ہے کہ یہ متن لیتا ہے اور پھر یہ 0s اور 1s میں ترجمہ، تاکہ عمل کہ ہم اوپر کیا جہاں ہم تعدد شمار اور پھر درخت تو نے اور کہا، "میں کس طرح T حاصل کروں؟" T 100 کی طرف سے ظاہر کیا جاتا ہے، اس طرح چیزوں اور پھر Huff متن اور پھر بائنری کہ پیداوار لیں گے. بلکہ کیونکہ ہم جانتے ہیں کہ ہم کو ہمارے پیغام کے وصول کنندہ کو اجازت دینے کے لئے چاہتے ہیں عین مطابق ایک ہی درخت کو آرام کرنے کے لئے، یہ بھی تعدد شمار کے بارے میں معلومات بھی شامل ہے. پھر ہم پف کے ساتھ 0s اور 1s کے ایک بائنری فائل دیا جاتا ہے اور بھی تعدد کے بارے میں معلومات دی. ہم اصل پیغام تھا میں ان 0s اور 1s پیٹھ کے سب ترجمہ تو ہم یہ پھیلانا رہے ہیں. اگر آپ سٹینڈرڈ ایڈیشن کر رہے ہیں، تو آپ کو Huff لاگو کرنے کے لئے کی ضرورت نہیں ہے، تو آپ Huff کے عملے پر عملدرآمد کا استعمال کر سکتے ہیں. اس رپورٹ میں کس طرح ایسا کرنے کے ہدایات ہیں. آپ کو ایک مخصوص متن فائل وسلم Huff کے عملے پر عملدرآمد کو چلا سکتے ہیں اور پھر آپ ان پٹ کے طور پر اس کی پیداوار پر پف کا استعمال کریں. جیسا کہ میں نے پہلے ذکر کیا ہے، ہم اس کے لئے تقسیم کے کوڈ کا ایک بہت ہے. میں نے اس کے ذریعے شروع کرنے جا رہا ہوں. میں وقت کے سب سے زیادہ خرچ کرنے جا رہا ہوں H فائلوں. کیونکہ سی فائلوں میں کیونکہ، ہم ایچ. اور اس کے افعال میں سے prototypes کے ساتھ فراہم کرتا ہے، ہم بالکل مکمل طور پر سمجھنے کے لئے کی ضرورت نہیں ہے - اگر آپ کو سمجھ میں نہیں آ رہا ہے کہ سی فائلوں میں کیا چل رہا ہے، تو بہت زیادہ فکر نہ کریں، لیکن یقینی طور پر ایک نظر لے کرنے کی کوشش کریں کیونکہ اس سے کچھ اشارہ دے سکتے ہیں اور اسے دوسرے لوگوں کے کوڈ کو پڑھنے کے کرنے کے لئے استعمال کرنے کے لئے مفید ہے. huffile.h کو دیکھ کر، اسے تبصرے میں فائلوں Huffman کوڈ کے لئے تجرید کی پرت کی یہ وانی ہے. اگر ہم جاتے ہیں، ہم دیکھتے ہیں کہ وہاں 256 علامات کی ایک زیادہ سے زیادہ ہے کہ ہم کے لئے کوڈ کی ضرورت ہو سکتی ہے. بڑے اور چھوٹے - یہ حروف تہجی کے تمام حروف شامل ہیں - تو اور علامات اور نمبر، وغیرہ اس کے بعد ہم یہاں ایک جادو ایک فائل Huffman کوڈ کی شناخت نمبر ہے. Huffman کوڈ کے اندر اندر انہوں نے ایک خاص جادو نمبر کے لئے جا رہے ہیں ہیڈر کے ساتھ منسلک ہے. یہ صرف ایک بے ترتیب جادو نمبر کی طرح ہو سکتا ہے، لیکن اگر آپ ASCII میں اصل میں یہ ترجمہ، تو یہ اصل میں باہر HUFF منتر ہے. یہاں ہم ایک فائل Huffman انکوڈنگ کے لئے ایک struct ہے. Huff فائل کے ساتھ منسلک کی خصوصیات کی تمام ہے. پھر یہاں نیچے ہم Huff فائل کے لئے ہیڈر ہے، تو ہم اسے Huffeader کہتے ہیں اضافی H بجائے انہوں نے مزید کہا کیونکہ یہ بھی ویسے بھی لگتا ہے. پیارا. ہم اس کے ساتھ وابستہ جادو نمبر ہے. اگر یہ ایک حقیقی Huff فائل ہے، اس تعداد کو اوپر، اس جادو ہو رہا ہے. اور پھر یہ ایک صف پڑے گا. تو ہر علامت کے لئے، جس میں سے 256 ہیں، فہرست ہے کہ ان علامات کے تعدد Huff فائل کے اندر اندر ہیں جا رہا ہے. اور پھر آخر میں، ہم تعدد کے لئے ایک حیض ہے، جو ان کے تعدد رقم ہونا چاہئے. تو ہے کہ کیا ایک Huffeader ہے. اس کے بعد ہم نے کچھ کام کرتا ہے جو Huff فائل میں اگلے تھوڑا سا واپس کے ساتھ ساتھ Huff فائل تھوڑی لکھتا ہے، اور اس کے بعد اس تقریب یہاں hfclose، جو اصل میں Huff فائل بند ہوجائے گا. سے پہلے، ہم براہ راست صرف fclose سے نمٹنے کر رہے تھے، لیکن جب تم نے ایک Huff فائل ہے، بجائے اس fclosing جو آپ اصل میں کرنے جا رہے ہیں ہے اور اسے hfopen hfclose. وہ Huff فائلوں کو مخصوص کام کرتا ہے کہ ہم سے نمٹنے جا رہے ہیں ہیں. تو پھر ہم یہاں ہیڈر میں اور اس کے بعد پڑھنے کے ہیڈر لکھنے. H فائل کو پڑھنے سے صرف ہم Huff فائل کیا ہو سکتا ہے کا احساس حاصل کی طرح کر سکتے ہیں، یہ اصل میں huffile.c میں بغیر کیا خصوصیات ہے، جو، اگر ہم میں کودو، تھوڑا سا زیادہ پیچیدہ ہونے جا رہا ہے. یہ فائل I / O یہاں اشارہ سے نمٹنے کے سب ہیں. ہم یہاں دیکھا کہ جب ہم hfread فون، مثال کے طور پر، یہ اب بھی fread کے ساتھ نمٹنے ہے. ہم ان کے افعال میں سے چھٹکارا نہیں کر رہے ہیں مکمل طور پر، لیکن ہم ان لوگوں کو بھیجنے کی دیکھ بھال پر لے جایا جائے ہو خود کی سب کرنے کے بجائے Huff فائل کے اندر. تم نے اس کے ذریعے اسکین کرنے کے لئے آزاد لگے گا اگر آپ جاننا ہو اور واپس پرت تھوڑا سا چھیل. اگلے فائل ہے کہ ہم کو دیکھنے کے لئے جا رہے ہیں tree.h. ہے سے پہلے میں Walkthrough سلائڈ ہم نے کہا کہ ہم نے ایک Huffman نوڈ کی توقع اور ہم ایک typedef struct نوڈ کیا. ہم اس علامت، تعدد، اور پھر 2 نوڈ ستاروں کی امید. اس صورت میں کیا ہم کر رہے ہیں ہے، یہ بنیادی طور پر ایک ہی ہے صرف نوڈ کے بجائے ہم ان درختوں کو فون کرنے جا رہے ہیں. ہم نے ایک تقریب میں ہے کہ جب آپ درخت بنانا کہتے ہیں یہ آپ کو ایک درخت پوائنٹر واپس ہے. ہجے کنندہ پر واپس جائیں، جب آپ کو ایک نیا نوڈ رہے تھے تم نے کہا نوڈ * نیا لفظ = malloc (sizeof) اور اس طرح کی چیزیں. بنیادی طور پر، mktree آپ کے لئے اس کے ساتھ نمٹنے جا رہا ہے. اسی طرح، جب آپ ایک درخت کو خارج کرنا چاہتے ہیں تاکہ بنیادی طور پر درخت آزاد ہے جب تم اس کے ساتھ کیا کر رہے ہیں، واضح طور پر اس پر آزاد کہہ کے بجائے، آپ اصل میں صرف تقریب rmtree کا استعمال کر رہے ہیں جا جہاں آپ پوائنٹر میں اس درخت کے پاس اور تو tree.c ہے کہ آپ کے لئے دیکھ بھال کرے گا. ہم tree.c. میں نظر آتے ہو ہم پر عملدرآمد کے طور پر دیکھ کر سوائے ایک ہی کام کرتا ہے کی امید رکھتے ہیں. جیسا کہ ہم توقع نہیں کی جب آپ کہتے mktree پوائنٹر میں ایک درخت کے سائز mallocs، نل قدر تو 0s یا NULLs اقدار کے initializes، اور پھر اس درخت پوائنٹر واپس ہے کہ آپ کو صرف آپ کو malloc'd ہے. یہاں جب تم درخت ہٹانے کہتے ہیں یہ سب سے پہلے اس بات کا یقین کر لیں کہ آپ آزاد ڈبل نہیں کر رہے ہیں دیتا ہے. یہ اس بات کا یقین کر لیں کہ آپ اصل میں ایک درخت ہے کہ آپ کو خارج کرنا چاہتے ہیں ہے کرتا ہے. یہاں وجہ سے ایک درخت بھی اس کے بچوں پر مشتمل ہے، یہ کیا ہوتا ہے یہ تکراری طور پر درخت کے بائیں نوڈ پر درخت ہٹانے کا مطالبہ کے ساتھ صحیح نوڈ کے طور پر. اس سے پہلے کہ اس کے والدین آزاد ہے، یہ بچوں کے طور پر آزاد کرنے کی ضرورت ہے. والدین بھی جڑ کے ساتھ تبادلہ ہے. تو عظیم کے عظیم عظیم کے پردادا کی طرح پہلی بار والدین، یا دادی کے درخت، سب سے پہلے ہمیں نیچے کی سطح پر سب سے پہلے آزاد ہے. تو نیچے گزرنا، مفت ان، اور پھر واپس آئے، مفت ان وغیرہ، تو وہ درخت ہے. اب ہم جنگل میں لگ رہی ہو. جنگل ہے جہاں آپ اپنے Huffman درختوں کی تمام جگہ. یہ کہہ رہا ہے کہ ہم کچھ کرنے جا رہے ہیں ملاقات کی ایک پلاٹ کہ ایک درخت پر ایک پوائنٹر کے ساتھ ساتھ نامی اگلے سازش پوائنٹر پر مشتمل ہے. ساخت کی طرح نظر آتے ہیں کیا اس طرح کرتا ہے؟ کی قسم کا کہنا ہے کہ وہاں ہے. ٹھیک ہے یہاں پر. ایک لنک کی فہرست. ہم دیکھتے ہیں کہ جب تم میں سے کسی ایک کو ہم نے ایک پلاٹ ہے یہ پلاٹوں کی ایک لنک کی فہرست کی طرح ہے. ایک جنگل پلاٹوں کی ایک لنک کی فہرست کے طور پر بیان کیا جاتا ہے، اور تو جنگل کی ساخت ہے، ہم صرف ہمارے پہلے پلاٹ پوائنٹر رہے ہیں جا اور یہ کہ پلاٹ اس کے اندر اندر ایک درخت ہے بلکہ ایک درخت کی طرف اشارہ ہے اور پھر اگلے سازش بتاتے ہیں، اور وغیرہ. ایک جنگل کو بنانے کے لئے ہم mkforest کہتے ہیں. اس کے بعد ہم نے کچھ بہت مفید کام کرتا ہے یہاں ہے. ہم نے لینے جہاں آپ کو ایک جنگل میں گزرتے ہیں اور اس کے بعد واپسی کی قدر ایک درخت * ہے، ایک درخت پر ایک پوائنٹر. منتخب کیا کریں گے یہ ہے کہ یہ جنگل میں جائیں گے کہ آپ کی طرف اشارہ کر رہے ہیں پھر اس جنگل سے سب سے کم تعدد کے ساتھ ایک درخت ہٹا دیں اور پھر تم نے اس کے درخت کو پوائنٹر دے. ایک بار جب آپ فون لینے کے جنگل میں درخت موجود ہیں، نہیں کیا جائے گا، لیکن واپسی قیمت اس درخت پوائنٹر ہے. تو پھر تم پلانٹ ہے. کہ آپ پوائنٹر میں ایک درخت ہے کہ میں ایک غیر 0 تعدد ہے گزر بشرطیکہ کیا پلانٹ کیا کرے گا اس جنگل، درخت لے، اور گا پلانٹ ہے کہ جنگل کے درخت کے اندر. یہاں ہم rmforest ہے. درخت، جو کہ بنیادی طور پر ہمارے لئے ہماری تمام درختوں کی آزاد کو ہٹانے کی طرح، جنگل ہٹانے کے اس جنگل میں موجود ہر چیز. اگر ہم forest.c میں دیکھو، ہم وہاں کم از کم 1 rmtree کمانڈ کو دیکھنے کے لئے کی توقع کریں گے، کیونکہ جنگل میں مفت میموری پر اگر اس میں ایک جنگل کے درخت ہیں تو بالآخر تم ان درختوں کو بھی کو دور کرنے کے لئے جا رہے ہیں. اگر ہم forest.c میں دیکھو، ہم اپنے mkforest، جس کا ہے جیسا کہ ہم امید کرتے ہیں ہے. ہم چیزوں malloc. ہم نل کے طور پر جنگل میں سب سے پہلے پلاٹ ابتدا کیونکہ اس کے ساتھ شروع کرنے کے لئے خالی ہے، تو پھر ہم پک،، جس میں سب سے کم وزن کے ساتھ درخت واپس سب سے کم تعدد، اور اس کے بعد ہے کہ خاص طور پر نوڈ سے نجات ہو جاتا ہے کہ، اس درخت پوائنٹس اور اگلے ایک تو یہ اس جنگل سے منسلک فہرست کے لیتا ہے. اور پھر ہم یہاں پلانٹ، جس میں منسلک فہرست میں ایک درخت اضافہ ہے. کیا جنگل ہے کہ یہ اچھی طرح سے رکھتا ہے، یہ ہمارے لئے کے مطابق ہے. اور پھر آخر میں، ہم rmforest ہے اور، کے طور پر امید کی جاتی ہے، ہم نے وہاں فون کیا rmtree ہے. کی تلاش میں تقسیم کوڈ میں اب تک، huffile.c شاید دور سمجھنے کی سب سے مشکل کی طرف سے تھا، جبکہ دیگر فائلوں پر عمل خود بہت سادہ تھے. اشارہ اور منسلک کی فہرست اور اس طرح ہمارے علم کے ساتھ، ہم بہت اچھی طرح کی پیروی کرنے کے قابل تھے. لیکن ہم واقعی اس بات کا یقین کر لیں کہ ہم مکمل طور پر سمجھ بنانے کی ضرورت فائلوں. H کیونکہ تم ان افعال بلا، واپسی کے ان اقدار سے نمٹنے کی ضرورت ہے، تو اس بات کا یقین کریں کہ آپ کو مکمل طور پر سمجھ کیا کارروائی کی کارکردگی کا مظاہرہ کیا جا رہا ہے جب بھی آپ ان کے افعال میں سے ایک کہتے ہیں. لیکن اصل میں اس کے اندر بہت سمجھنے کی ضرورت ہے کیونکہ ہم ان ہے H فائلوں. ہم 2 مزید ہمارے تقسیم کے کوڈ میں چھوڑ فائلوں ہے. ڈمپ میں نظر ہے. اس تبصرہ کی طرف سے یہاں ڈمپ فائل Huffman کمپریسڈ لیتا ہے اور پھر ترجمہ اور dumps اس کے مواد کے سب باہر ہیں. ہم یہاں دیکھتے ہیں کہ یہ hfopen بلا رہا ہے. * ان پٹ = fopen دائر mirroring کی طرح ہے، اور پھر آپ کی معلومات میں گزرتے ہیں. بجائے ایک فائل * آپ ایک Huffile میں گزر رہے ہیں سوائے تقریبا ایک جیسی ہے، fopen کے بجائے آپ hfopen میں گزر رہے ہیں. یہاں پہلے ہم نے ہیڈر میں پڑھتے ہیں، جن میں سے قسم ہے کہ ہم کس طرح ہیڈر میں پڑھنے کے لئے اسی طرح کی ہے ایک بٹ نقشہ فائل کے لئے. ہم یہاں کیا کر رہے ہیں کو دیکھنے کے لئے جانچ پڑتال ہے چاہے ہیڈر کی معلومات صحیح جادو تعداد جس کی طرف اشارہ کرتا ہے کہ یہ ایک حقیقی Huff فائل ہے پر مشتمل ہے، پھر ان چیکوں کی تمام اس بات کا یقین کرنے کے لئے کہ فائل ہے کہ ہم کھلے ایک حقیقی huffed فائل یا نہیں ہے. اس کا کیا ہے، یہ علامات ہے کہ ہم دیکھ سکتے ہیں میں سے سب سے تعدد نتائج ایک گرافیکل ٹیبل میں ایک ٹرمینل کے اندر اندر. یہ حصہ مفید ہو جا رہا ہے. یہ تھوڑا سا ہے اور متغیر بٹ میں تھوڑا تھوڑا پڑھتا ہے اور پھر اسے پرنٹ باہر ہے. تو اگر میں hth.bin، جو ایک فائل huffing کا نتیجہ ہے ڈمپ پر کال عملے حل کا استعمال کرتے ہوئے، مجھے یہ ملے گا. یہ ان حروف کی سب لکھنا اور پھر تعدد جس میں وہ ظاہر ہوتے ہیں ڈال. اگر ہم دیکھو، ان میں سے اکثر اس کے علاوہ 0s ہیں: H، جو دو مرتبہ ظاہر ہوتا ہے، اور پھر T، جو ایک بار ظاہر ہوتا ہے. اور پھر ہم یہاں 0s اور 1s میں اصل پیغام ہے. اگر ہم hth.txt میں نظر آتے ہیں، جو شاید اصل پیغام ہے جو huffed کیا گیا ہے، ہمیں وہاں میں کچھ ایچ ایس اور TS کو دیکھنے کے لئے کی توقع ہے. خاص طور پر، ہم نے صرف 1 T اور 2 HS کو دیکھنے کے لئے کی امید رکھتے ہیں. یہاں ہم hth.txt میں ہیں. یہ واقعی HTH ہے. وہاں میں شامل ہیں، اگرچہ ہم اسے دیکھ نہیں سکتے، ایک newline کردار ہے. Huff فائل hth.bin بھی newline کردار انکوڈنگ ہے. یہ ہم جانتے ہیں کہ HTH اور پھر newline ہے کیونکہ ہم صرف ایک واحد 1 دیکھتے ہیں کہ شاید H نمائندگی ہے اور پھر T شاید 01 ہے اور پھر اگلے H 1 بھی ہے اور اس کے بعد ہم نے ایک دو 0s کی طرف سے دلالت کرتی newline ہے. ڈاؤن لوڈ، اتارنا. ، اور پھر آخر میں، کیونکہ ہم نے ایک سے زیادہ سی. کے ساتھ نمٹنے کر رہے ہیں. اور ایچ فائلوں ہم سنکلک ایک خوبصورت پیچیدہ دلیل کو جا رہے ہیں، اور اسی طرح ہم یہاں ایک Makefile ہے جو آپ کے لئے ڈمپ کرتا ہے ہے. لیکن اصل میں، آپ کو آپ کے اپنے puff.c فائل بنانے کے بارے میں جانے کے لئے ہے. Makefile اصل آپ کے لئے puff.c کرنے سے نہیں. ہم چھوڑ رہے ہو آپ پر Makefile میں ترمیم کرنے کی. جب آپ سب کی طرح ایک کمانڈ میں داخل ہیں، مثال کے طور پر، یہ آپ کے لئے ان میں سے سب کر دے گا. گزشتہ pset سے Makefile کی مثالیں پر نظر بلا جھجھک کے ساتھ ساتھ اس ایک کی یہ دیکھنے کے لئے کہ آپ کس طرح اپنے پف فائل کو بنانے کے لئے کے قابل ہو سکتا ہے اس Makefile میں ترمیم کی طرف سے. یہ ہمارے تقسیم کے کوڈ کے لئے اس کے بارے میں ہے. ایک بار ہم نے اس کے ذریعے ملا ہے، تو صرف یہاں ایک اور یاد دہانی ہے کس طرح ہم Huffman نوڈس کے ساتھ نمٹنے جا رہے ہیں. ہم ان مراکز بلا اب نہیں رہے ہیں، ہم ان درختوں پر بلا رکھا جائے جا رہے ہیں جہاں ہم ایک حروف کے ساتھ ان کی علامت پر نمائندگی کرنے جا رہے ہیں، ان کی فریکوئنسی، واقعات کی ایک عددی کے ساتھ تعداد. ہم اس کا استعمال کریں کیونکہ یہ ایک فلوٹ سے زیادہ عین مطابق ہے رہے ہیں. اور پھر ہم بائیں کے ساتھ ساتھ بچے کو صحیح بچے کی ایک اور پوائنٹر ہے. ایک جنگل، جیسا کہ ہم نے دیکھا، صرف درختوں کی ایک لنک کی فہرست ہے. آخر میں، جب ہم نے تعمیر ہمارے Huff فائل رہے ہیں ہم جنگل صرف 1 درخت شامل کرنا چاہتے ہیں - 1 درخت، ایک سے زیادہ بچوں کے ساتھ 1 جڑ. پہلے جب ہم صرف ہمارے Huffman درخت بنا رہے تھے، ہم ہمارے سکرین پر مراکز کی سب رکھ کی طرف سے شروع کیا ہم ان مراکز کے لئے جا رہے ہیں اور کہہ رہے ہیں، بالآخر وہ پتے، کر رہے ہیں اور یہ ان کی علامت ہے، یہ ان کا تعدد ہے. ہمارے جنگل میں اگر ہم صرف 3 حروف ہیں، جو 3 درختوں کی ایک جنگل ہے. اور پھر ہم جاتے ہیں، جب ہم پہلی والدین نے کہا، ہم نے 2 درختوں کے جنگل بنا دیا ہے. ہم جنگل سے ان بچوں کی 2 تو ہٹا دیا اور والدین نوڈ کے ساتھ اس کی جگہ ہے کہ بچوں کو ان 2 نوڈس تھا. اور پھر آخر میں، جیسا کہ گریڈ کے ساتھ ہماری مثال بنانے کے ساتھ ہمارے آخری مرحلہ ہے، اور کاوچ سرفنگ کے آخری والدین کرنا ہوگا، اور تو ہے کہ 1 ہماری جنگل میں درختوں کی کل شمار لے آئے گی. سب کیا یہ دیکھنے کی ضرورت ہے کہ آپ کس طرح ایک سے زیادہ درخت کے ساتھ آپ کے جنگل میں شروع اور 1 کے ساتھ ختم ہو؟ ٹھیک ہے. ڈاؤن لوڈ، اتارنا. ہم پف کے لئے کیا کرنے کی ضرورت ہے؟ ہم کیا کرنے کی ضرورت ہے اس بات کا یقین کرنے کے لئے کہ، ہمیشہ کی طرح، وہ ہمیں ان پٹ کے دائیں قسم دے ہے تاکہ ہم اصل پروگرام چلا سکتے ہیں. اس صورت میں وہ ہمیں ان کی پہلی دلیل کمانڈ لائن کے بعد دینے جا رہے ہیں 2: فائل ہے کہ ہم اور پھیلا دی گئی فائل کی پیداوار پھیلائیں کرنا چاہتے ہیں. لیکن جب ہم اس بات کا یقین کر لیں کہ وہ ہمیں اقدار کے دائیں رقم میں گزرے، ہمیں اس بات کا یقین کرنے کے لئے کہ ان پٹ Huff فائل یا نہیں ہے کرنا چاہتے ہیں. اور پھر ایک بار ہم اس بات کی ضمانت دیتا ہوں کہ یہ ایک Huff فائل ہے، تو ہم اپنے درخت کی تعمیر کرنا چاہتے ہیں، ایسی ہے کہ یہ درخت کہ وہ شخص جس نے پیغام بھیجا تعمیر سے میل کھاتا ہے درخت کی تعمیر کے. پھر اس کے بعد ہم درخت کی تعمیر، تو پھر ہم ساتھ 0s اور 1s کہ وہ میں منظور نمٹنے کر سکتے ہیں ہمارے درخت کے ساتھ ان کی پیروی کرتے ہیں کیونکہ یہ ایک جیسی ہے، اور پھر اس پیغام لکھنے بٹس، حروف میں واپس تشریح. اور پھر آخر میں ہے کیونکہ ہم اشارہ کے ساتھ یہاں کام کر رہے ہو، ہم اس بات کا یقین کر لیں کہ ہم کسی بھی میموری لیک نہیں ہے بنانا چاہتے ہیں اور یہ کہ ہم آزاد سب کچھ. مناسب استعمال کو یقینی بنانے کے اب تک ہمارے لئے پرانے ٹوپی ہے. ، ہم نے ایک ان پٹ میں لے، جس کی فائل کے نام فلانا جا رہا ہے اور پھر ہم ایک پیداوار کی وضاحت کرتے ہیں، puffed پیداوار، جس میں ٹیکسٹ فائل ہو جائے گا کے لئے فائل کے نام پر. وہ استعمال ہے. اور اب ہمیں اس بات کا یقین کرنے کے لئے کہ ان پٹ huffed ہے یا نہیں کرنا چاہتے ہیں. واپس سوچ رہا تھا، وہاں تقسیم کوڈ ہے جو ہمیں مدد کر سکتا ہے میں کچھ تھا سمجھنے کہ ایک فائل huffed ہے یا نہیں ہے؟ کے بارے میں huffile.c میں Huffeader معلومات تھی. ہم جانتے ہیں کہ ہر Huff فائل ایک جادو تعداد کے ساتھ اس کے ساتھ منسلک Huffeader ہے کے طور پر ساتھ ساتھ ہر علامت کے لئے تعدد کے ایک صف کے ساتھ ساتھ ایک پڑتالی مجموعہ کے طور پر. ہم یہ جانتے ہیں، لیکن ہم بھی dump.c میں جھانکنا لیا، جس میں یہ Huff فائل میں پڑھ رہا تھا. اور تاکہ کرنا، یہ چیک کرنے کے لیے تھا کہ کیا یہ واقعی huffed یا نہیں کیا گیا تھا. تو شاید ہم اپنے puff.c. کے لئے ایک ڈھانچہ کے طور پر dump.c استعمال کر سکتے ہیں 4 pset پر واپس جائیں جب ہم فائل copy.c ہے کہ RGB triples میں کاپی اور ہم نے Whodunit اور کا سائز تبدیل کرنے کے لئے کہ تشریح، اسی طرح، جو آپ کر سکتے ہیں صرف CP dump.c puff.c کی طرح کمانڈ چلائیں اور وہاں کوڈ میں سے کچھ کا استعمال کریں. تاہم، یہ ایک عمل کے طور پر براہ راست نہیں ہے ، puff.c میں آپ کی dump.c ترجمہ کے لئے لیکن کم از کم یہ تمہیں کہیں ہے جس میں شروع کس طرح اس بات کا یقین کرنے کے لئے کہ ان پٹ اصل huffed ہے یا نہیں کے ساتھ ساتھ کچھ دوسری چیزوں کے طور پر. ہم مناسب استعمال کو یقینی بنایا ہے اور اس بات کا یقین ہے کہ ان پٹ huffed. ہر وقت ہے کہ ہم نے کیا کیا ہے کہ ہم اپنے مناسب غلطی کی چیکنگ نے کیا کیا ہے، تو واپس آ تقریب چھوڑنے اگر کوئی ناکامی اس وقت ہوتی ہے، اگر کوئی مسئلہ ہے. اب جو ہم کرنا چاہتے ہیں اصل درخت کی تعمیر ہے. اگر ہم جنگل میں دیکھو، 2 اہم کام ہیں کہ ہم کے ساتھ بہت واقف بننے کے لئے جا رہے ہیں. بولین تقریب پلانٹ ہے کہ پودوں ہمارے جنگل کے اندر ایک غیر 0 تعدد درخت اور تو وہاں آپ کو ایک پوائنٹر کے میں جنگل اور ایک درخت پر ایک پوائنٹر گزرتے ہیں. فوری سوال: آپ کتنے جنگلات جب آپ کو ایک Huffman درخت بنا رہے ہیں؟ ہمارا جنگل ہمارے کینوس کی طرح ہے، ہے نا؟ تو ہم صرف 1 جنگل جا رہے ہیں، لیکن ہم ایک سے زیادہ درخت لگائے جائیں جا رہے ہیں. تو قبل اس کے کہ آپ پودوں سے کہتے ہیں، تو آپ کو شاید اپنے جنگل کو بنانے کے لئے چاہتے ہیں کے لئے جا رہے ہیں. اس کے لئے ایک حکم ہے اگر آپ کو آپ کو ایک جنگل کس طرح کر سکتے ہیں forest.h میں دیکھتا ہے. آپ کو ایک درخت لگانے کر سکتے ہیں. ہم جانتے ہیں کہ کس طرح ایسا. اور پھر تم نے جنگل سے ایک درخت بھی منتخب کر سکتے ہیں، سب سے کم وزن کے ساتھ ایک درخت کو ختم کرنے اور آپ اس دے پوائنٹر. جب ہم نے مثالیں کر خود کو کیا گیا تھا واپس سوچ رہے ہیں، جب ہم اسے ڈرائنگ باہر نکال رہے تھے، ہم تو صرف لنک شامل ہیں. لیکن یہاں کے بجائے صرف لنک انہوں نے مزید کہا، اس سے زیادہ لگتا ہے کہ کے طور پر آپ کو ان مراکز کی 2 اتارنے پھر رہے ہیں اور ایک دوسرے کی طرف سے اس کی جگہ. منتخب کرنا اور لگانے کے معاملے میں اس کا اظہار، آپ کو 2 درختوں اٹھا تو کر رہے ہیں اور ایک درخت لگانا ان 2 درخت ہے کہ آپ کے بچے کے طور پر اٹھایا ہے. Huffman درخت کی تعمیر کرنے کے لئے، آپ کو ترتیب میں علامات اور تعدد میں پڑھ سکتے ہیں کیونکہ Huffeader آپ کو دیتا ہے، آپ کے تعدد پر ایک سرنی دیتا ہے. تو تم آگے بڑھو اور اس میں 0 سے کچھ بھی نظر انداز کر سکتے ہیں کیونکہ ہم اس کے اختتام پر 256 پتے نہیں کرنا چاہتا. ہم صرف پتے جو کہ حروف ہیں کی تعداد میں چاہتا ہوں جو اصل میں فائل میں استعمال کیا جاتا ہے. آپ ان علامات میں پڑھنے، اور ان علامات جو تعدد غیر 0 میں سے ہر ایک کر سکتے ہیں، ان پیڑوں کے لئے جا رہے ہیں. آپ کیا کر سکتے ہیں ہر وقت آپ کو ایک غیر 0 تعدد علامت میں پڑھا ہے، آپ کو جنگل میں درخت لگانے کر سکتے ہیں. ایک بار جب آپ کو جنگل میں درخت پلانٹ، آپ بہن بھائیوں کے طور پر ان پیڑوں میں شامل کر سکتے ہیں، تو پودے لگانے اور جہاں تمہیں لینے اٹھا 2 اور پھر 1 پلانٹ واپس جا، جہاں کہ 1 ہے کہ آپ پودوں سے 2 بچوں کہ آپ اٹھایا والدین ہے. تو پھر آپ آخر اسکے نتیجے کے طور پر آپ کے جنگل میں ایک درخت بننے جا رہا ہے. یہ ہے کہ آپ کس طرح آپ کے درخت کی تعمیر کے. کئی چیزیں ہیں وہ غلط کر سکتے ہیں کیونکہ ہم نئے درخت بنانے اور اس طرح اشارہ اور چیزوں کے ساتھ نمٹنے کے ساتھ کام کر رہے ہو. جب ہم نے اشارہ سے نمٹنے کر رہے تھے اس سے پہلے، جب بھی ہم malloc'd ہم اس بات کا یقین کر لیں کہ یہ ہمیں واپس نہیں کیا ایک نل پوائنٹر قدر کرنا چاہتا تھا. تو اس عمل کے اندر اندر کئی اقدامات میں کئی مقدمات کے لئے جا رہے ہیں اپنے پروگرام کو ناکام کہاں جا سکتا ہے. آپ کیا کرنا چاہتے ہیں آپ کو اس بات کا یقین کر لیں کہ آپ ان غلطیوں کو سنبھالنا کرنا چاہتے ہیں، اور اس رپورٹ میں ان gracefully سنبھال کا کہنا ہے کہ، تو صارف کو ایک پیغام کو پرنٹ انہیں بتا کیوں پروگرام چھوڑ پسند اور اس کے بعد فوری طور پر اسے چھوڑ دیا. اس خرابی کو سنبھالنے کرنے کے لئے یاد رکھیں، کہ آپ اسے چیک کرنے کے لیے کرنا چاہتے ہیں ہر وقت ہے کہ ناکامی ہو سکتی ہے. ہر ایک وقت ہے کہ آپ کو ایک نیا پوائنٹر کر رہے ہیں آپ کو اس بات کا یقین کر لیں کہ کہ کامیاب ہے بنانے کے لئے چاہتے ہیں. ، ہمیں کیا کرنا استعمال کیا جاتا ہے ایک نئی پوائنٹر اور اس malloc سے پہلے اور پھر ہم چیک کرنے کے لیے چاہے وہ پوائنٹر نل ہے. تو کچھ مثالوں جہاں آپ ایسا صرف کر سکتے ہیں کے لئے جا رہے ہیں، لیکن کبھی کبھی آپ کو اصل میں ایک تقریب کو بلا رہے ہیں اور اس تقریب کے اندر اندر، کہ ایک کہ mallocing کر رہی ہے. اس صورت میں، اگر ہم نے کوڈ کے اندر اندر کے افعال میں سے کچھ واپس دیکھو، ان میں سے کچھ بولین افعال ہیں. خلاصہ صورت میں اگر ہم نے ایک بولین کہا جاتا FOO ایک تقریب ہے، بنیادی طور پر، ہم نے جو بھی FOO کرتا کرنے کے علاوہ کہ فرض کر سکتے ہیں، کیونکہ یہ ایک بولین تقریب ہے، یہ سچ ہے یا جھوٹ واپس - سچ ہے اگر یہ کامیاب رہا، جھوٹے نہیں ہو. تو ہم چیک کرنے کے لیے کرنا چاہتے ہیں کہ FOO کی واپسی کی قیمت صحیح یا غلط ہے. اگر یہ جھوٹ ہے، اس کا مطلب یہ ہے کہ ہم پیغام کی کسی قسم کو پرنٹ کرنے کے لئے کرنا چاہتے ہیں جا رہے ہیں اور پھر پروگرام چھوڑ دیا. ہم کیا کرنا چاہتے ہے FOO کی واپسی کی قیمت چیک کرنے کے لیے ہیں. اگر FOO جھوٹے واپس، تو ہم جانتے ہیں کہ ہم نے غلطی کی کسی قسم کا سامنا کرنا پڑا اور ہم اپنے پروگرام کو چھوڑ کرنے کی ضرورت ہے. ایک ایسا راستہ ہے جس سے ایک شرط ہے جہاں اصل تقریب میں ہی آپ کی شرط ہے. کہو FOO X میں لیتا ہے. ہم اگر ایک شرط کے طور پر کر سکتے ہیں ((X) FOO). بنیادی طور پر، اس کا مطلب ہے کہ اگر یہ FOO قتل کے آخر میں صحیح واپس، تو پھر ہم ایسا کر سکتے ہیں کیونکہ تقریب FOO اندازہ ہے کے لئے پوری کی حالت کا اندازہ کرنے کے لئے. تو اس طرح آپ ہی کچھ کر سکتے ہیں اگر فنکشن درست واپس اور کامیاب ہے. لیکن جب تم نے غلطی پڑتال کر رہے ہیں، تو آپ صرف اگر آپ کی تقریب جھوٹے واپس چھوڑ کرنا چاہتے ہیں. آپ کیا کر سکتے ہیں صرف شامل ہے ایک == یا باطل اس کے سامنے ایک دھماکے شامل کریں اور پھر اگر تم (FOO!) ہے. کہ اس حالت کے جسم کے اندر اندر آپ کو غلطی سے نمٹنے کی سب ہوگا، تو پسند ہے، تو "اس کے درخت کو پیدا نہیں کیا جا سکا" اور 1 یا اس طرح کچھ واپس. ہے کہ وہ کیا کرتا ہے، تاہم، کہ اگرچہ FOO جھوٹے واپس ہے - کہو FOO صحیح واپس. تو پھر تم FOO دوبارہ کال نہیں ہے. یہ ایک عام غلط فہمی ہے. کیونکہ یہ آپ کی حالت میں تھا، اس کے پاس پہلے سے ہی تعین کیا ہے، تو آپ کے پاس پہلے سے ہی نتیجہ ہے اگر آپ کو درخت یا ایسا کچھ کرنے کے استعمال کر رہے ہیں پلانٹ یا پسند یا کچھ اور. یہ پہلے سے ہی اس قدر ہے. یہ پہلے ہی پھانسی دے دی ہے. لہذا یہ شرط کے طور پر بولین کام کرتا ہے استعمال کرنے کے لئے مفید ہے کیونکہ یا اصل میں آپ کو لوپ کی لاش نہیں پھانسی یہ تقریب ویسے بھی executes. ہماری آخری مرحلے پر دوسری فائل پیغام لکھ رہی ہے. ایک بار جب ہم Huffman درخت کی تعمیر، پھر فائل پیغام لکھنے بہت براہ راست ہے. یہ خوبصورت براہ راست اب صرف 0s اور 1s پر عمل کریں. اور اس طرح ہم نے کنونشن کی طرف سے جانتے ہیں کہ Huffman درخت میں 0s چھوڑ اس بات کی نشاندہی اور 1s صحیح اشارہ ملتا ہے. تو پھر اگر آپ نے بٹ کی طرف سے تھوڑا سا میں پڑھتے ہیں، ہر وقت ہے کہ آپ 0 ملتا ہے آپ کو بائیں برانچ کی پیروی اور اس کے بعد کریں گے ہر وقت آپ 1 میں پڑھا تم صحیح برانچ کی پیروی کرنے جا رہے ہیں. اور پھر آپ کو جاری ہو جب تک آپ کو ایک پتی مارا کیونکہ پتے شاخوں کے آخر میں ہونے جا رہے ہیں. ہم کہ ہم نے ایک پتی یا نہ مارو ہے کس طرح کہہ سکتے ہیں؟ ہم نے اس سے پہلے کہا. [طالب علم] اگر اشارہ نل ہیں. >> جی ہاں. ہم بتا دو اگر ہم پتی مارا ہے اگر بائیں اور دائیں دونوں درخت اشارہ نل ہیں کر سکتے ہیں. ٹھیک ہے. ہم جانتے ہیں کہ ہم ہمارے Huff فائل میں تھوڑا سا میں پڑھ کرنا چاہتے ہیں. جیسا کہ ہم dump.c میں پہلے دیکھا، انہوں نے کیا کیا ہے وہ Huff فائل میں بٹ کی طرف سے تھوڑا سا میں پڑھیں اور صرف طباعت ان بٹس تھے. ہم یہ ہے کہ ایسا کرنے کے لئے نہیں کر رہے ہیں. ہم کچھ ہے کہ تھوڑا سا زیادہ پیچیدہ ہے کر جا رہے ہیں. لیکن جو ہم کر سکتے ہیں ہے کہ ہم کوڈ کا تھوڑا سا جو کچھ میں پڑھتا لے جا سکتے ہیں. یہاں ہم عددی موجودہ تھوڑا ہے کہ ہم ہیں کی نمائندگی سا ہے. یہ فائل میں بٹس کی سب iterating کا خیال لیتا ہے جب تک کہ آپ کو فائل کے آخر مارا. اس بنا پر، تو پھر آپ iterator کے کچھ قسم ہے کرنا چاہتے ہیں جا رہے ہیں اپنے درخت کو گزرنا ہے. اور پھر چاہے تھوڑا 0 یا 1 ہے کی بنیاد پر، آپ کو یا تو بائیں iterator کہ کو منتقل یا دائیں منتقل کرنا چاہتے ہیں جا رہے ہیں طرح جب تک آپ کو ایک پتی مارا ہے، تو وہ نوڈ کہ تم پر تک پورے راستے زیادہ نوڈس نہیں کی طرف اشارہ کرتا ہے. ہم Huffman فائل لیکن مورس کوڈ کے ساتھ نہیں کیوں یہ کر سکتا ہوں؟ کیونکہ مورس کوڈ میں ابہام کے تھوڑا سا ہے. ہم نے طرح، اوہ انتظار ہو سکتا ہے، ہم نے راستے میں ایک خط متاثر کیا ہے، تو ہو سکتا ہے یہ ہمارا خط ہے، جبکہ اگر ہم اب صرف تھوڑا سا جاری، پھر ہم نے ایک اور خط ہے متاثر کرے گی. لیکن یہ ہونے والا ہے Huffman انکوڈنگ میں نہیں، ہم تو آرام کر سکتے ہیں یقین دہانی کرائی ہے کہ صرف ایک ہی طریقہ ہے کہ ہم جا رہے ہیں ایک کردار کو نشانہ بنانے اگر کہ نوڈ کے بائیں اور دائیں بچوں نل ہیں. آخر میں، ہم ہماری میموری کی سب آزاد کرنا چاہتے ہیں. ہم دونوں کے قریب Huff فائل کرنا چاہتے ہیں کہ ہم کیا گیا ہے کے ساتھ نمٹنے کے ساتھ ساتھ ہمارے جنگل میں درختوں کی سب کو ہٹا دیں. آپ کے عمل پر کی بنیاد پر، آپ کو شاید کرنا چاہتے ہیں جا رہے ہیں جنگل ہٹانے فون کرنے کی کی بجائے اصل میں درخت خود سے گزر رہا ہے. لیکن اگر آپ کے ذہن میں کوئی عارضی درخت بنایا ہے، کہ تم آزاد کرنا چاہتے ہیں کریں گے. آپ اپنے کوڈ کو سب سے بہتر طور پر جانتے ہیں، تو آپ کو پتہ ہے تم کہاں میموری آونٹن کر رہے ہیں. اور اگر ایسا ہے تو بھی malloc کے لئے F'ing کنٹرول کی طرف سے شروع کیا جس میں آپ کو جانے، دیکھ جب بھی آپ malloc اور اس بات کا یقین ہے کہ تم اس کے سب آزاد لیکن یہ تو صرف اپنا کوڈ کے ذریعے ہو رہا ہے، جہاں آپ میموری مختص ہو سکتا ہے سمجھنے. عام طور پر، آپ صرف اتنا کہنا انہوں نے کہا کہ ایک فائل کے آخر میں میں نے صرف میری جنگل جنگل کو دور کرنے جا رہا ہوں، "ہو سکتا ہے تو بنیادی طور پر اس میموری کو واضح، مفت، "اور پھر میں بھی فائل اور قریب پھر اپنے پروگرام چھوڑ جا رہا ہے جا رہا ہوں." لیکن یہ صرف اب وقت آ گیا ہے کہ اپنے پروگرام برابر ہے؟ نہیں، کیونکہ کبھی کبھی میں ایک خرابی ہے جو کچھ بھی ہوا ہے ہو سکتا ہے. شاید ہم ایک فائل نہیں کھول یا ہم دوسرے درخت نہ کر سکے سکتا ہے یا کچھ قسم کی غلطی کی میموری مختص کرنے کے عمل میں ہوا تھا اور اس لئے یہ نل واپس. ایک خرابی ہوا اور پھر ہم واپس آئے اور چھوڑ دیا. تو پھر آپ اس بات کا یقین کر لیں کہ آپ کے پروگرام ہے کہ کسی بھی ممکنہ وقت چھوڑ سکتے ہیں بنانے کے لئے چاہتے ہیں، آپ کو آپ کی میموری کی سب وہاں آزاد کرنا چاہتے ہیں. یہ اہم تقریب ہے کہ آپ اپنے کوڈ کو چھوڑ دیا کے آخر میں صرف نہیں جا رہے ہیں. ہر مثال کے طور پر واپس دیکھنا چاہتا ہوں کہ اپنے کوڈ کو ممکنہ طور پر وقت سے پہلے ہی واپس کر سکتے ہیں اور پھر مفت میموری جو کچھ بھی سمجھ میں آتا ہے. کہتے ہیں کہ تم نے فون کیا تھا جنگل ہے اور اس جھوٹے واپس. تو پھر آپ شاید اپنے جنگل کو دور کرنے کے لئے کی ضرورت نہیں کرے گا کیونکہ آپ کو ایک جنگل کی ضرورت نہیں ہے. لیکن آپ کو کوڈ میں ہر موڑ پر ہے جہاں وقت سے پہلے ہی واپس کر سکتے ہیں آپ کو اس بات کا یقین کر لیں کہ آپ کسی بھی ممکنہ میموری آزاد کرنا چاہتے ہیں. ، تو جب ہم میموری آزاد سے نمٹنے کر رہے ہیں اور ممکنہ لیک ہونے ہم نہ صرف ہمارے فیصلے اور ہماری منطق استعمال کرنا چاہتے ہیں پر بھی استعمال Valgrind کا تعین ہے کہ ہم ہمارے میموری کی سب آزاد صحیح طور پر نہیں ہے. آپ پف پر Valgrind یا تو اور پھر چلانے تم بھی اسے منظور ہے کر سکتے ہیں دلائل کمانڈ لائن کی صحیح تعداد Valgrind. تم اس چلاتے ہیں، لیکن پیداوار تھوڑا خفیہ ہے کر سکتے ہیں. ہم نے ہجے کنندہ کے ساتھ اس کے لئے استعمال کیا جاتا سا ہو گیا ہے، لیکن ہم اب بھی تھوڑا سا زیادہ مدد کی ضرورت ہے، تو یہ لیک چیک کرنے کے لیے مکمل = جیسے چند پرچم کے ساتھ چل رہا ہے، جو ہمیں شاید Valgrind پر کچھ زیادہ مددگار پیداوار دے گا. اس کے بعد ایک اور مفید ٹپ جب آپ ٹھیک رہے ہیں فرق حکم ہے. آپ Huff کے عملے پر عملدرآمد تک رسائی حاصل کرتے ہیں، کہ، ایک ٹیکسٹ فائل پر چلا سکتے ہیں اور پھر یہ ایک بائنری فائل، Huff کے ایک بائنری فائل پیداوار، مخصوص. پھر اگر آپ اس بائنری فائل خود اپنے پف چلاتے ہیں، پھر مثالی طور پر، آپ کے outputted ٹیکسٹ فائل جیسی بننے جا رہا ہے اصل ایک ہے کہ تمہیں اندر منظور میں یہاں مثال کے طور پر hth.txt استعمال کر رہا ہوں، اور یہ کہ اپنی رپورٹ میں کے بارے میں بات کی ہے. یہ لفظی صرف HTH اور پھر newline ہے. لیکن یقینی طور پر مفت لگے گا اور آپ کو یقینی طور پر طویل مثال کے طور پر استعمال کرنے کے لئے حوصلہ افزائی کی جاتی ہے آپ کے ٹیکسٹ فائل کے لئے. آپ شاید سکیڑنا میں ایک شاٹ بھی اور اس کے بعد لے جا سکتے ہیں پھیلانا جنگ اور امن کی طرح فائلوں ہے کہ آپ کو ہجے کنندہ میں استعمال کیا کچھ یا جین Austen یا اس طرح کچھ - یا آسٹن، ٹیکساس پاورس - جو کول کی طرح ہو جائے گا طرح کی بڑی فائلوں کے ساتھ نمٹنے کے کی وجہ سے ہم اس پر نہیں آ گے اگر ہم اگلے آلہ، LS L-استعمال کیا. ہم LS، جو کہ بنیادی طور پر ہماری موجودہ ڈائریکٹری میں تمام مواد کی فہرست کرنے کے لئے استعمال کر رہے ہیں. پرچم L-گزرنے میں ان فائلوں کی سائز دکھاتا ہے. اگر آپ pset رپورٹ کے ذریعے جانا، یہ اصل میں آپ کو بائنری فائل بنانے کے ذریعے چلتا ہے، یہ huffing، اور آپ کے پاس ہے کہ بہت چھوٹے فائلوں کے لئے دیکھ اس کو سکیڑنا اور اس معلومات کے سب ترجمہ جگہ قیمت اس طرح تمام تعدد اور چیزوں کی اصل فائدہ outweighs پہلی جگہ میں فائل سکیڑنا. لیکن اگر تم اسے کچھ طویل متن فائلوں پر چلنے، اس وقت تم دیکھتے ہیں کہ آپ کو کچھ فائدہ حاصل کرنے کے لئے شروع کر سکتے ہیں ان فائلوں کو سکیڑنا. اور پھر آخر میں، ہم نے اپنے پرانے دوست GDB، جو ضرور ہاتھ میں بھی آنے والا ہے. کیا ہم درخت بنانے کے Huff درخت یا عمل پر کوئی سوال شاید پف Huff'n پر کسی دوسرے سوال؟ ٹھیک ہے. میں تھوڑی دیر کے لئے یہاں رہیں گے. شکریہ، سب. یہ 6 Walkthrough تھا. اور اچھی قسمت ہے. [CS50.TV]