You are on page 1of 28

‫‪Intro‬‬

‫شابت من كتاب " ‪Grokking Algorithms: An Illustrated‬‬ ‫إن شاء هللا ده هيكون ملخص رسي ع لكل ر‬
‫‪ " Guide for Programmers and Other Curious People‬بما إنه كتاب شيق جدا وسهل القرائة‬
‫شابت ن يف شكل مقاالت عىل ‪ LinkedIn‬الخاص يب ‪.Moustafa Shomer‬‬ ‫ملخصي كل ر‬
‫ن‬ ‫ورسي ع‪ ،‬احنا كنا‬
‫ن‬ ‫ن‬
‫للمبتدئي لسه يف ال ‪- Algorithms‬أنا‪. -‬‬ ‫و من ال يىل عرفته إن الكتاب مخصص‬
‫يتعج من الطريقة البسيطة و يحاول ياخدها ك ‪ refresher‬ر‬
‫حن لو هو دارس المادة‬ ‫فأتمن إن محدش ن ن‬ ‫ن‬
‫بتاعتها ن يف الجامعة أو قارئ كتب مختصة ن يف الموضوع‪.‬‬
‫لزميلن ‪ Menna Nawar‬لمراجعتها و مساندتها الدائمة ن يف الكتابة و النش‪ ،‬الكتاب ده طلع‬‫ي‬
‫ر‬ ‫و كل الشكر‬
‫نتمن تستفيدوا و يعجبكم و تنشوه ك‬ ‫للنور بسبب جميع القراء الىل أبدوا شغف واهتمام لىل بنعمله‪ ،‬ف ر‬
‫ي‬ ‫ي‬
‫صدقة علم‪.‬‬
‫‪Chapter 1‬‬
‫بي ‪ Binary search‬و ‪Simple search‬‬ ‫شابت الكاتب بيقارن ن‬ ‫نف أول ر‬
‫ي‬
‫ن‬
‫و هو باختصار انك لو بتحاول تدور عىل اسم حد عىل فيسبوك مثال ف عندك طريقتي‪:‬‬
‫ال انت‬
‫ال عليها كل الحسابات لحد متوصل لإلسم ي‬ ‫‪ -1‬إنك تعدي عىل اسم اسم فالداتا بتاعة فيسبوك ي‬
‫عاوزه‬
‫ال بتدور‬‫األسام دي أبجديا و بعدها تدور بطريقة متكررة عن أقرب حروب بتمثل اإلسم ي‬ ‫ي‬ ‫‪ -2‬إنك ترتب‬
‫عليه‬
‫ال إنت‬ ‫ن‬ ‫ن‬ ‫ن‬ ‫ن‬
‫طبعا أول طريقة يف حالة ماليي الداتا هتاخد ماليي العمليات‪ ,‬النك يف كل عملية بتقارن اإلسم ي‬
‫تاب عملية بيعتمد عىل ترتيب الداتا لسبب مهم جدا‪.‬‬ ‫ن ن‬
‫ال طلعلك‪ ,‬يف ي‬ ‫عاوزه باإلسم ي‬
‫و خطوات عمل األلجورذم ر‬
‫كاالب‪:‬‬
‫ي‬
‫‪ -1‬بتحدد قيم ‪ max - min‬و دي بتعتمد عىل الداتا بتاعتك‬
‫ال بتدور عليها‬ ‫ال فالنص و بتقارنها بالقيمة ي‬ ‫‪ -2‬بتختار القيمة ي‬
‫يبق هتخليها ال ‪ max‬الجديدة بتاعتك‬ ‫‪ -3‬لو القيمة ال فالنص أكت من القيمة ال انت عاوزها ر‬
‫ي‬ ‫ي‬
‫ه ال ‪ min‬الجديدة‬ ‫ر‬
‫ال بتدور عليها يبق هتخليها ي‬ ‫ال فالنص دي أقل من القيمة ي‬ ‫و لو القيمة ي‬
‫هتجع تا ن يب لنقطة ‪2‬‬ ‫‪ -4‬ر‬
‫معي وسط أرقام كتت ‪-‬‬‫ن‬ ‫ال بتدور عليها دي‪ ,‬سواء رقم‬ ‫ر‬ ‫و هتفضل تلف ن يف ال ‪ loop‬دي لحد‬
‫متالف القيمة ي‬
‫ي‬
‫هتالف القيمة دي و ساعتها المفروض األلجورذم بيطلعلك ‪ null‬إن القيمة دي مش‬ ‫ر‬ ‫م رتتبة‪ ، -‬أو مش‬
‫ي‬
‫موجودة أصال‬
‫الفايدة فالموضوع انك لو عندك ‪ data point 240000‬مثال و هتقارن عليها الستش بتاعك‪ ,‬و قول انك‬
‫ن يف أسوأ حالة هتضطر ن يف حالة األلجورذم البسيط انك تعمل ‪ 240000‬خطوة لحد متوصل للرقم بتاعك‪,‬‬
‫أما ن يف حالة ال ‪ Binary search‬ف هتحتاج ‪ 18‬خطوة فقط عشان توصل للحل‪.‬‬
‫هو برضو اتكلم عن كيفية حساب رسعة األلجورذمات باستخدام ال‪ ،Big O notation‬ولكن هنتكلم عنها‬
‫بالتفصيل ن يف الشباتر الجاية‪.‬‬
‫‪Chapter 2‬‬
‫الشابت ده الكاتب بيتكلم عن ال ‪ linked lists vs arrays‬وبيقول ال ‪ pros/cons‬لكل واحد‬ ‫ر‬ ‫ن يف‬
‫ن يف األول هو اتكلم عن الميموري وازاي البيانات بتتخزن فيها يا اما بطريقة منظمة ورا بعض‪ ،‬يا اما بطريقة‬
‫لىل بعده‬
‫مش منظمة ورا بعض لكن كل مكان بيشت ي‬
‫ال‪:linked list‬‬
‫ن‬ ‫ن‬ ‫ر‬
‫هنا الداتا بتكون متتبة يف أي مكان يف الميموري‪ ،‬وكل مكان بيشت للمكان ال يىل بعده ال يىل فيه داتا‬
‫من مزاياها انك بتقدر تعمل ‪ insertion‬بشكل رسي ع‬
‫من عيوب ها انك بتاخد وقت أطول عشان تقرا داتا‪ ،‬ألنك محتاج تعدي عىل كل األماكن ال ين قبليها عشان‬
‫التني ومن ن‬
‫اتني‬ ‫ن‬ ‫تمش من رقم واحد عشان توصل‬ ‫ن‬
‫يعن لو الداتا ترتيبها العارسة‪ ،‬هتحتاج‬
‫ي‬ ‫تعرف توصلها‪ ،‬ي‬
‫لتالتة وهكذا‪.‬‬
‫ال‪:arrays‬‬
‫ن‬ ‫ن‬
‫بالتتيب ورا بعضها‪ ،‬لو عندك خمس اماكن يف الميموري يف الخمسة بيكونوا ورا‬ ‫هنا الداتا بتكون منظمة ر‬
‫بعض‪ ،‬و ده بيتيح ليك انك تقرا اي داتا انت عاوزها من غت ما تحفظ مكان الداتا ال يىل بعدها‪.‬‬
‫من مزاياها إنك تقدر تقرأ الداتا بشعة جدا‪ ،‬و بتحتاج ده عشان تنفذ ألجورذمات زي ال ‪binary search‬‬
‫ال فات‬‫ال اتكلمنا عنه فالبوست ي‬ ‫ي‬
‫ال محفوظ فيه‬ ‫من عيوب ها إنك كل مهتحب تزود داتا أو تمسح داتا محتاج تغت ال تركيب بتاع الميموري ي‬
‫الداتا‪.‬‬
‫محفوظي ورا بعض‪ ،‬لو احتاجت تضيف خانة زيادة ف انت‬ ‫ن‬ ‫بمعن انت لو عندك ‪ ٥‬خانات للداتا بيكونوا‬ ‫ن‬
‫ن‬
‫تانيي‬ ‫يبق هتضطر تدور عىل ‪ ٦‬خانات‬ ‫هنا محتاج خانة جمبهم‪ ،‬و لو الخانة دي نف الميموري مشغولة‪ ،‬ر‬
‫ي‬
‫ورا بعض ن يف الميموري‪ ،‬وهكذا كل ما تحب تضيف عنرص جديد‪.‬‬
‫ومن الحلول المطروحة للمشكلة دي انك تقدر بكل بساطة تحجز مثال ‪ ١٠‬خانات مسبقا بحيث اي عنرص‬
‫جديد هيدخل ن يف الخانات الفاضية‪ ،‬بس عيب ده انك بتحجز مكان فالميموري ممكن متستغلهوش‪.‬‬
‫ستاكتشز ال يىل بنستخدمها ن يف أغلب ال ‪applications‬‬ ‫االتني دول نقدر نعمل أغلب الداتا ر‬ ‫ن‬ ‫باستخدام‬
‫ولغات التمجة الحالية‪ ،‬زي اننا نقدر نعمل ‪ array of linked lists‬وهكذا‪.‬‬
‫ن يف االخر اتكلم عن ال ‪ selection sort‬وهو انك بتحاول ترتب داتا عندك وبتضطر تلف يف كل عنرص فيها‬
‫ن‬
‫الشابت الجاي‬‫ر‬ ‫باف العنارص ال يىل قبلها و تاخد أقل‪-‬أعىل قيمة و تحطها ن يف ‪ list-array‬جديدة‪ ،‬و ن يف‬ ‫ر‬
‫وتقارنه ب ي‬
‫هيتكلم عن ألجورذم أسهل وأرسع منه ال يىل هو‪.quick sort‬‬
‫‪Chapter 3‬‬
‫تاب أو بتعمل‬ ‫ن‬ ‫ر‬ ‫ن‬
‫وه أي فنكشن بتنادي عىل نفسها ي‬ ‫يف أول الشابت الكاتب رسح ال ‪ recursive functions‬ي‬
‫ن‬
‫يعن‪.‬‬
‫‪ call‬لنفسها ي‬
‫زي ايه مثال؟‬
‫مثال لو عاوز اكتب فنكشن تفضل تزود الرقم بقيمة ‪ ١‬لحد متوصل للرقم المطلوب‪ ،‬فلو بدأنا بصفر‬
‫هتفضل تزود واحد لحد متوصل ل ‪ y‬وهو ال يىل انت عاوزة‪.‬‬
‫طب ايه المشكلة ما نعملها ن يف فور لووب عادية؟‬
‫الفكرة ان عشان تعمل ‪ clean code‬مفهوم و سهل يتقرأ األحسن من انك تكتب ‪ for loop‬بتعمل جواه‬
‫عمليات كتت‪ ،‬انك تعمل فنكشن وتحط جواها العمليات دي كلها‪ ،‬بس بطبيعة الحال أحيانا بتضطر‬
‫تعملها ‪ for loop‬لو ربق فيه مشاكل فال‪.memory‬‬
‫طبعا المثال كمان بسيط جدا للتوضيح مش ر‬
‫اكت‪.‬‬
‫الفكرة ربق هنا ان عشان تعمل ‪ recursion‬صح الزم رسط مهم جدا‪ ،‬و هو انك متنساش ابدا تحط الشط‬
‫ال عاوز توصله‪.‬‬ ‫األساس ي‬
‫ي‬
‫ج كل مرة‪ ،‬ابسط حاجة ‪ 1+x=x‬وخالص‪ ،‬هنا ال يىل داخل‬ ‫مثال لو عاوز فنكشن تزود واحد عىل الرقم ال يىل ي‬
‫مني انها وصلت للرقم المطلوب؟ الزم تحط ‪if‬‬ ‫للفنكشن ‪ ،x‬طب والفنكشن المفروض هتعرف ن‬
‫‪ condition‬ربق‪ if x = y ،‬و ده الشط ال يىل عىل أساسه بتطلع من ال‪ ،recursion loop‬و طبعا تخيل لو‬
‫ن‬
‫تاب تزود واحد وهكذا‪.‬‬
‫معملتهوش فالفنكشن هتفضل تاخد اكس تزود عليه واحد و تبعته ي‬
‫اكت الفنكشن شكلها‪:‬‬ ‫للتوضيح ر‬

‫‪Def rec(x):‬‬
‫‪x= x+1‬‬
‫)‪rec(x‬‬
‫و دي ال يىل هتعمل ‪ recursion‬اه بس لألبد‪ ،‬الفكرة انك تكتبها صح كدا‪:‬‬

‫‪def Rec(X):‬‬
‫‪if X == y:‬‬
‫‪return X‬‬

‫‪else:‬‬
‫‪X+=1‬‬
‫)‪Rec(x‬‬
‫و هنا الكاتب قسمهم إل‪:‬‬
‫وه الحالة ال يىل بتعت عن انك وصلت للمطلوب خالص و تطلعك برة اللوب‪.‬‬ ‫‪ :Base case‬ي‬
‫ر‬
‫‪ :Recursive case‬و دي تقدر تعتتها الفنكشن بق ال يىل بتكررها‪ ،‬انك تزود واحد فالحالة دي‪.‬‬

‫ه يعتت اي حد اخد مقدمة عن الكمبيوتر ساينس عارف‬ ‫ر‬ ‫ن‬ ‫ن‬


‫التاب من الشابت اتكلم عن ال‪ ،stack‬و ي‬
‫يف الجزء ي‬
‫ايه هو الستاك‪ ،‬هو زي صندوق بتحط فيه كتب‪ ،‬معندكش غت فتحة واحدة بس بتحك فيها و بتطلع‬
‫هيبق هو أول واحد عىل‬‫منها‪ ،‬الكتاب الىل عىل الوش هو الىل هيطلع األول‪ ،‬و الكتاب الىل هتدخله جديد ر‬
‫ي‬ ‫ي‬ ‫ي‬
‫الوش‪.‬‬
‫ن‬
‫الفكرة هنا ربطه للستاك فالبايثون‪ ،‬ودي حاجة مكونتش متخيلها الحقيقة‪ ،‬وهو ان يف لغة البايثون مفيش‬
‫حاجة اسمها اعمل ڤاريابل نوعه ستاك‪ ،‬الفكرة ان الكمبيوتر ذات نفسه بيستخدم الستاك وانت شغال ن يف‬
‫كذا فنكشن‪ ،‬مش الزم حالة ال ‪ ،recursion‬ال أي فنكشن جواها فنكشن تانية‪.‬‬
‫رقمي و ن‬
‫بترصب هم و بعدها تبعت الناتج لفنكشن تانية تقسم الناتج عىل ‪٢‬‬ ‫ن‬ ‫مثال لو عندك فنكشن بتاخد‬
‫يترصب ف مية‪.‬‬‫وترجعه عشان ن‬

‫‪Def fn2(z):‬‬
‫‪Z=z/2‬‬
‫‪Return Z‬‬

‫‪Def fn1(x,y):‬‬
‫‪Z= x*y‬‬
‫‪Return fn2(Z)*100‬‬

‫ساعتها الميموري ال يىل بيتخزن فيها قيم المتغتات ن يف كل فنكشن بتتحفظ ن يف ستاك‪ ،‬ن يف اول حاجة بتدخل‬
‫يترصبوا ويتحفظوا ن يف متغت ‪، z‬‬
‫الرقمي ‪ x , y‬وبعدها ن‬
‫ن‬ ‫بتكون الفنكشن رقم ‪ 1‬وبيكون محفوظ فيها قيمة‬
‫بعدها بيدخل الستاك فنشكن ‪ 2‬و بيكون فيها قيمة الناتج ‪،z‬‬
‫ر‬
‫دلوقن‬
‫ي‬ ‫ه بتخلص االول‪ ،‬ن يف الفنكشن ‪ 2‬ال يىل بتقسم هتخلص األول‬ ‫ن‬
‫و زي ما تعلمنا يف الستاك أول حاجة ي‬
‫يترصب ن يف ‪.١٠٠‬‬ ‫ألنها احدث حاجة‪ ،‬وبعدها الناتج هتجع للفنكشن رقم ‪ 1‬عشان ن‬
‫وهكذا‪ ،‬أنا عارف الموضوع معقد وصعب يتشح بالكالم بس الكتاب فعال شارحه بطريقة رائعة برسومات‬
‫أتمن يكون وصل ولو ‪ ٢٠‬ن يف المية من الشح‪.‬‬‫كتت لألسف مش هقدر أنزلها هنا كلها‪ ،‬بس ن‬
‫‪Chapter 4‬‬
‫الشابت ده الكاتب بيتكلم عن طريقة ال ‪divide and conquer‬أو ال ‪D&C‬‬ ‫ر‬ ‫ن يف‬
‫ه بكل بساطة انك بتقسم المشكلة بتاعتك لمشاكل أصغر فأصغر‪ ،‬لحد متوصل ألبسط مشكلة‪ ،‬و من‬ ‫و ي‬
‫بال وصلتله و هكذا‪.‬‬ ‫الىل قبلها و تعوض فيها ي‬ ‫هنا بتبدأ تحلها و تطلع عىل الخطوة ال ي‬
‫ر‬ ‫ن‬
‫الىل اتكلمنا عنه يف شابت ‪٣‬‬ ‫فكرتك بحاجة صح؟ ال ‪ recursion,‬ي‬
‫هو يعتت زي تطبيق عليه‪ ،‬انت بيكون عندك‪ ، base case‬و بيكون عندك‪ ، recursive case‬و غالبا‬
‫ابسط حالة بتكون لما ميكونش عندك اي عنرص "‪ "element‬فال ‪array‬‬
‫الىل بتوصلك لل ‪ base case‬دي‪.‬‬ ‫ن‬
‫ه ي‬ ‫تاب‪ ،‬ي‬
‫الىل بتنادي فيها ال ‪ function‬ي‬‫و الحالة ي‬
‫ً‬
‫طريقة ال ‪ D&C‬مستخدمة ن يف حاجات كتت جدا حوالينا‪ ،‬و أشهر تطبيق ليها هو ال ‪quick sort‬‬
‫ً‬
‫جدا‪ ،‬ر‬
‫كاآلب‪:‬‬
‫ي‬ ‫ه عملية ترتيب العنارص ن يف أي ‪ array‬بطريقة رسيعة و سهلة‬ ‫و ي‬
‫ال بتقارن بيه أو ال‪anchor‬‬ ‫ن‬
‫‪-‬أنت بتختار عنرص يف ال ‪ list‬وتعتته األساس بتاعك ي‬
‫‪-‬و تقارن كل العنارص الموجودة ن يف ال ‪ list‬بيه‪ ،‬وتقسمهم عىل حسب أي ‪ criteria‬عاوز ترتب بيها‪ ،‬مثال‬
‫لو اكت يبقوا ن يف ‪ list‬لوحدهم‪ ،‬ولو أصغر يبقوا ن يف ال ‪ list‬التانية‪.‬‬
‫باف العنارص بيه وتفصلهم وهكذا‪.‬‬ ‫ر‬ ‫ن‬ ‫ر‬
‫تاب‪ ،‬وتختار عنرص من ال ‪ list‬وتقارن ي‬ ‫‪-‬بعدها بتجع للخطوة األول ي‬
‫هتجعه‪*base case*.‬‬ ‫يتبق عنرص واحد نف ال ‪ list‬الىل عندك ي ربق هو ده الىل ر‬ ‫‪-‬لما ر‬
‫ي‬ ‫ي‬ ‫ي‬
‫و بكده تقدر تقسم المشكلة لمشاكل صغتة أبسط و تبدأ تحلها بطريقة هرمية‪ ،‬فنفس الوقت بتستخدم‬
‫التكرار فانك بتنادي نفس الفنكشن بتاعتك عىل األجزاء األبسط من المشكلة‪.‬‬
‫بي ال ‪ ،merge sort - quick sort‬اتكلم عن ازاي ال ‪ bigO notation‬ال يىل بتدل عىل‬ ‫بعدها الكاتب قارن ن‬
‫يعن ال ‪ merge‬و‬ ‫ن‬ ‫ً‬ ‫ن‬
‫الىل بيعملها ‪ algorithm‬معي‪ ،‬مش دايما بتعت عن الشعة‪ ،‬ي‬ ‫عدد ال ‪ operations‬ي‬
‫ن‬ ‫ن‬
‫االتني ليهم ))‪ ، O(n log(n‬بس مش معن كده ان االتني ليهم نفس الشعة‪ ،‬ألن ال ‪bigO‬‬ ‫ن‬ ‫‪،quick‬‬
‫الىل ممكن تعت عن رسعة العمليات دي‪.‬‬ ‫بيهمل ال ‪ constants‬ي‬
‫ثواب‪ ،‬بس كل واحدة بتعمل عدد ‪n‬‬ ‫ن‬ ‫ن‬
‫و ادى مثال عن عمليتي‪ ،‬واحدة بتاخد ثانية و التانية عش ي‬
‫ً‬ ‫‪ ،operations‬ر‬
‫يبق ساعتها ال ‪ bigO‬بتاعهم هيساوي‪ ، n‬لكن ده مش بيعكس أبدا رسعة العمليات وال‬
‫يعتت مقياس للشعة‪ ،‬بل هو مقياس لعدد العمليات فقط‪.‬‬
‫‪Chapter 5‬‬
‫الشابت ده الكاتب بيتكلم عن ال ‪ hash tables‬و عن استخدامها و أهميتها و ن‬
‫ممتاتها‪ ،‬بإختصار ال‬ ‫ر‬ ‫ن يف‬
‫وغالبا معمولها ‪ implementation‬ن يف أغلب اللغات‪.‬‬ ‫ً‬ ‫ه ال ‪،dictionaries‬‬ ‫‪ hash tables‬ي‬
‫ن‬ ‫ا‬
‫ه زي ‪mapping function /‬‬ ‫ي‬ ‫و‬ ‫‪،‬‬‫‪hash‬‬ ‫‪functions‬‬ ‫ال‬ ‫عن‬ ‫نتكلم‬ ‫الزم‬ ‫التفاصيل‪،‬‬ ‫ف‬
‫ي‬ ‫ندخل‬ ‫عشان‬ ‫أوًل‬
‫معي‪ ،‬نف حالة ال ‪ hash tables‬هو ‪ index‬او مكان فن‬ ‫ن‬ ‫‪ encoder‬بيحول أي ‪ input‬ل ‪output‬‬
‫ي‬ ‫ي‬
‫‪.list/array‬‬
‫ال ‪ hashing functions‬دي مهمة جدا و تعتت حجر األساس فال ‪ ،hash tables‬الن دمج ال‬
‫ه‬ ‫ر‬ ‫ر‬
‫ه ي‬ ‫‪ hashing functions‬و ‪ list‬او ‪ array‬بق عندك داتا ستاكتش جديد رسعة الوصول للداتا جواه ي‬
‫يعن أي عملية بتاخد‬ ‫رسعة اضافة او ازالة عنرص من عنارصه‪ ،‬وه نف ال ‪ )1(big O notation = O‬ن‬
‫ي‬ ‫ي ي‬
‫وحدة من الزمن مش ر‬
‫أكت‪.‬‬
‫ممتات و عيوب ال ‪ functions‬دي ان ممكن‬ ‫طبعا ده بيعتمد عىل نوع ال‪ ،hashing function‬الن من ن‬
‫يبق ن يف عنرصين عاوزين ياخدوا نفس ال ‪ index‬ن يف ال ‪ list‬بتاعتك‪،‬‬ ‫تختار نوع يعملك ‪ ،collision‬وهو ان ر‬
‫هيبق عندك ليست أساسية‬ ‫ر‬ ‫يعن‬‫ن‬ ‫ن‬
‫وساعتها ال ‪ index‬ده هيحتوي عىل عنرصين متشالي ف ‪ list‬تانية‪ ،‬ي‬
‫الىل حصل بينهم ‪.collision‬‬ ‫بيشاور عىل مكان فيها‪ ،‬والمكان ده جواه ليست فيه العنرصين ي‬
‫مشكلة ال ‪ collision‬بتتحل باستخدام ‪ hashing function‬أحسن‪ ،‬وأغلب ال ‪ implementations‬فن‬
‫ي‬
‫لغات التمجة مستخدمة ‪ hashing function‬كويسة ومش هتضطر تغتها‪.‬‬
‫باستخدام ال ‪ hash tables‬ربق زي مقولنا هتقدر تعمل ‪ mapping‬ألي ‪ value‬عندك ب ‪ value‬تانية‪،‬‬
‫معي‪ ،‬بدل مهتحفظها ن يف ‪ list‬ال انت ممكن تحفظ اسمه ك ‪ key‬و ال‬ ‫ن‬ ‫مثال لو عاوز الداتا بتاعة ‪user‬‬
‫ه‬ ‫ر‬
‫ه الداتا‪ ،‬وبكده كل ما تعوز تجيب الداتا هتدخل اسمه لل ‪ hashing function‬و ي‬ ‫‪ value‬تبق ي‬
‫هتعملك ‪ mapping‬وتطلعلك ال ‪ value‬المحفوظه ن يف اقرص وقت ممكن‪.‬‬
‫طبعا نقدر نستخدم خواص ال ‪ hashing tables‬اننا نعمل ‪ cache‬ل ‪ information‬معينة بتتكرر كتت‪،‬‬
‫لو عندك صفحة ‪ static‬مثال وحاطتها ف ‪ ،button‬بدل ما كل ميتضغط عىل الزرار ده يعمل ‪request‬‬
‫للداتا من عىل ستفر‪ ،‬ال انت ممكن تحفظها ن يف ‪ hash table‬ولو كان الزرار ده موجود ضمن ال ‪keys‬‬
‫يبق رجع ال ‪ value‬للصفحة دي عىل طول‪ ،‬وبكده تكون وفرت وقت و ‪.processing‬‬ ‫ر‬
‫‪Chapter 6‬‬

‫الشابت ده الكاتب اتكلم عن ال‪ breadth-first search‬وهو ‪ searching algorithm‬بيستخدم ن يف‬ ‫ر‬ ‫ن يف‬
‫عاجبن أوي ف هحاول أنظمه شوية هنا بإذن هللا‪.‬‬ ‫ن‬ ‫حالة ال‪ ،graphs‬الحقيقة ترتيب الشح مكانش‬
‫ي‬
‫ه عبارة عن حلقات متوصلة ببعضها عن طريق خيوط ‪ -‬تخيل‬ ‫ه ال‪ ، graphs‬ي‬ ‫أول حاجة نتكلم عن ايه ي‬
‫معايا كونان و هو بتبط األحداث ببعض‪ ، -‬كل حلقة هنسميها ‪ node‬متصلة بالتانية عن طريق ‪.edge‬‬
‫بمعن ان عادي‬ ‫ن‬ ‫ومن خواص ال ‪ graph‬ان مش الزم كل ال‪ nodes‬تكون متوصلة بكل ال‪ nodes‬التانية‪،‬‬
‫اتني منهم بس يعرفوا شخص رابع‪ ،‬و ساعتها واحد من التالتة مش هيكون‬ ‫تالتة يكونوا صحاب‪ ،‬و ن‬
‫متوصل بالشخص الرابع ده‪.‬‬
‫يعن ‪ directional‬و ممكن تكون‬ ‫ن‬
‫ال‪ edges‬ممكن تكون بتعت عن عالقة من طرف واحد ي‬
‫بمعن لو أحمد سلف محمد فلوس ف‬ ‫ن‬ ‫‪ unidirectional‬أو زي ما الكاتب اشار ليها ‪،undirectional‬‬
‫يبق هتعت عن‬ ‫ياسمي متجوزين ر‬
‫ن‬ ‫ممكن نعت عنها باستخدام ‪ ،directional edge‬لكن لو محمد و‬
‫ن‬
‫تستغن عنها و تحطها‬ ‫العالقة دي ب ‪ directional edges ٢‬و ساعتها تقدر‬
‫الطرفي‪ ،‬ياس ن‬
‫مي‬ ‫ن‬ ‫بي‬‫‪ unidirectional/undirectional‬و خالص‪ ،‬و من هنا هيتفهم ان العالقة واحدة ن‬
‫ن‬
‫ياسمي‪.‬‬ ‫متجوزة محمد و محمد متجوز‬

‫ن‬
‫يعن لو تخيلت معايا شجرة العائلة هيكون‬ ‫ن‬
‫بيمش يف اتجاه واحد‪ ،‬ي‬
‫ي‬ ‫ال ‪ tree‬نوع من أنواع ال ‪ graph‬لكنه‬
‫زمن‪ ،‬مفيش حاجة‬ ‫ن‬ ‫ن‬
‫يف طرف فيها االحفاد و فوقيهم األبناء و فوقيهم اآلباء و هكذا‪ ،‬بتكون ماشية بتسلسل ي‬
‫يبق حفيد ‪-‬اال لو بتتفرج عىل ‪.-dark‬‬ ‫اسمها الجد ر‬
‫سؤالي ن يف‬
‫ن‬ ‫حلو‪ ..‬بعد ما عرفنا ال‪ ،graph‬هنبدأ نعرف األلجورذم ده بيعمل ايه‪ ،‬هو بيساعدك تجاوب عىل‬
‫أي ‪ graph‬عندك‪:‬‬

‫‪ -١‬هل نف طريق يربط ن‬


‫بي ‪ node‬و التانية؟‬ ‫ي‬

‫‪ -٢‬ايه هو أقرص طريق يربط ن‬


‫بي ال ‪ nodes‬دي؟‬

‫ممكن تتخيل مشكلة انك بتحاول توصل لمكان ما‪ ،‬فبتشوف انت لو واقف فالموقف و بتحاول تروح مكان‬
‫الىل انت عاوزه ده؟‬ ‫ن‬ ‫ن‬
‫معي‪ ،‬هل يف مواصلة تقدر توصلك للمكان ي‬
‫ولو فيه مواصالت تقدر توصلك‪ ،‬فايه هو ابسط مواصلة ممكن تاخدها‪.‬‬
‫وتاكش‪ ،‬و ممكن تركب‬
‫ي‬ ‫فممكن تركب ‪ ٣‬أتوبيسات عشان توصل للمكان ده‪ ،‬وممكن تركب مشوع‬
‫ن‬ ‫ن‬
‫وف أسوأ الحاالت فأنت متواجد يف مكان معزول‬ ‫ن‬ ‫نن‬
‫الىل انت عاوزة‪ ،‬ي‬
‫مواصلة واحدة بس تتلك يف المكان ي‬
‫ومش هتقدر تروح للوجهة بتاعتك دي‪.‬‬
‫ال من‬
‫تقدر تحول أي مشكلة بتواجهها ل‪ ،graph‬و تطبق عليه األلجورذم ده عشان تجاوب عىل األسئلة ي‬
‫النوع ده‪.‬‬

‫ازاي األلجورذم بيشتغل؟‬


‫ً‬
‫الىل انت عنده‪ ،‬و تاخد‬
‫هو شبه ال‪ simple search‬بسيط جدا‪ ،‬بتقف عند ‪ node‬معينة ولتكن الموقف ي‬
‫كل المواصالت الموجودة وتشوف هتوصلك للوجهة بتاعتك وال أل‪ ،‬طبعا كل مواصلة هتوديك ل‪node‬‬
‫تانية‪.‬‬
‫هتكب كل المواصالت المتاحة ن يف‬ ‫ن‬
‫تاب خطوة و ر‬ ‫ر‬
‫تشوف هل وصلت بعد أول ‪ step‬؟‪ ،‬لو أل يبق هتاخد ي‬
‫الىل انت عاوزها؟ و هكذا‪.‬‬ ‫ن‬
‫تاب وصلت لل‪ node‬ي‬‫الىل انت نزلت فيه ده‪ ،‬و تسأل نفسك ي‬
‫المكان ي‬

‫وف ‪ Gif‬بيوضح العملية ر‬


‫بالتتيب هنا قبل الشح‪GIF :‬‬ ‫ن‬
‫ي‬
‫األلجورذم بتتب كل االحتماالت المتاحة و بيمش نف كل فرع مع كل ‪ ،step‬اول خطوة دي ر‬
‫بتبق ‪first‬‬ ‫ي ي‬
‫تاب خطوة بتديك ال ‪ second degree‬و هكذا‪.‬‬ ‫ن‬ ‫ن‬
‫يعن أقرب حاجة‪ ،‬ي‬‫‪ degree‬ي‬
‫ن‬
‫وف‬ ‫ن‬
‫الىل انت عاوزها معن كدا ان اه فيه ‪ ،path between node A and node B‬ي‬ ‫لو وصلت لل ‪ node‬ي‬
‫ماس ب ‪ steps‬منتظمة و مرتبة عن طريق ال‪ ،degree‬فانت بيكون عندك كمان‬‫ي‬ ‫نفس الوقت بما انك‬
‫ر‬
‫يعن لو انت وصلت لل‪ node‬من أول ‪ ،step‬يبق كدا ده اقرص طريق‪ ،‬وهو اخد مواصلة‬‫ن‬
‫اقرص ‪ ،path‬ي‬
‫يبق أقرص طريق هو ال ‪.fourth degree‬‬‫واحدة بس‪ ،‬لو وصلت بعد ‪ ٤‬خطوات ر‬

‫ازاي ال‪ graph‬بنمثله ن يف لغة التمجة؟‬


‫اوال هو بيكون متكون من ‪ ، hash tables/dictionaries‬فمثال ال‪ keys‬هتعت عن ال‪ nodes‬و‬
‫الىل احنا فيه‪ ،‬و‬ ‫ن‬ ‫ن‬
‫يعن ال‪ key‬يف المثال بتاعنا هيعتت المكان ي‬
‫ال‪ values‬هتعت عن ال‪ ،connections‬ي‬
‫الىل نقدر نوصلها منه باستخدام المواصالت المختلفة‪.‬‬
‫ه األماكن ي‬ ‫ال‪ values‬ي‬
‫ر‬ ‫ر‬ ‫ن‬
‫ثانيا‪ ،‬بندخل كل ال‪ values‬دي يف ‪ ، queue‬بحيث تبق كل حاجة متتبة حسب درجة القرب و األهمية‪،‬‬
‫ا‬
‫فمثًل انت ن يف أول خطوة هتضيف كل االحتماالت بتاعتها فال ‪ ،queue‬وتشوف لو ال‪destination‬‬
‫يبق هتاخد ‪ step‬تانية وتضيف كل االحتماالت بتاعتها فال ‪ ،queue‬و هكذا‪،‬‬ ‫بتاعتك موصلتلهاش ر‬
‫بحيث انك متطلعش من ال‪ first degree‬غت لما تكون تأكدت انك موصلتش للجهة بتاعتك فيها‪ ،‬و‬
‫ال فال ‪ second degree‬و هكذا‪.‬‬ ‫ر‬
‫بعدين تدخل بالتتيب عىل االحتماالت ي‬
‫التتيب بنظام ‪ ،first in first out‬بحيث انك كل ما تضيف‬ ‫و احنا بنستخدم ال‪ queue‬عشان ننظم ر‬
‫احتماالت هتتحط فاالخر وهتفضل تلف فيها خطوة خطوة ر‬
‫بالتتيب‪ ،‬األقرب ثم األبعد‪.‬‬
‫جدا‪ ،‬هو بس ر‬ ‫ً‬ ‫ن‬
‫اقتح حل‬ ‫سء صعب‬ ‫يف االخر وأنا عارف ان رسح حاجة زي ال‪ graphs‬من غت صور ي‬
‫متصلي ببعض فانت ممكن تقع ن يف ‪ ،infinite loop‬تاخد خطوة من ‪A‬‬ ‫ن‬ ‫لمشكلة انك لو عندك ‪nodes 2‬‬
‫توصل لالحتمال الوحيد وهو ‪ ،B‬وبعدها تاخد خطوة تانية توصل لالحتمال الوحيد وهو ‪ ،A‬والتالتة‬
‫توديك ‪ B‬وهكذا‪ ،‬الحل انك تضيف كل احتمال انت مشيت فيه قبل كدا و استكشفته ن يف ‪ list‬فاضية‪،‬‬
‫ن‬
‫مرتي‪ ،‬ف لو االحتمال انت اولردي مشيت فيه و موجود جوا‬ ‫تمش ن يف طريق‬
‫ي‬ ‫بحيث انك متضطرش‬
‫الليست دي هتعمله ‪.skip‬‬

‫ر‬
‫االب‪:‬‬
‫النهاب هيكون بالشكل ي‬
‫ي‬ ‫الكود‬

‫ن يف النهاية توصلنا الن رسعة األلجورذم ده ‪-‬بما انه بسيط و بياخد كل االحتماالت المتاحة لحد ميوصل‬
‫ه( ‪ ،O(V+E‬حيث ان ‪ V‬تعت عن عدد ال ‪ ،nodes‬و ‪ E‬تعت عن عدد ال ‪.edges‬‬ ‫للهدف بتاعة‪ -‬ي‬
‫‪Chapter 7‬‬

‫ر‬
‫الشابت ده الكاتب اتكلم عن ألجورذم اسمه مش هحاول أنطقه الرصاحة "‪ "Dijkstra's‬وأنت وضمتك‬ ‫ن يف‬
‫ن يف القراية‪ ،‬المهم أن األلجورذم ده ضاف حبة تعقيد شوية عىل طريقة عمل ال‪،breadth-first search‬‬
‫بحيث أنه بيستعمل ن يف إيجاد أقرص طريق ن يف ‪.weighted graph‬‬
‫الىل بتدفعه‬ ‫ن‬ ‫ن‬
‫يعن ببساطة ان كل‪ edge‬عليها قيمة معينة‪ ،‬بتعت عن ال‪ cost‬ي‬
‫يعن ايه ‪ ،weighted graph‬ي‬ ‫ي‬
‫الىل ن يف آخر ال ‪.edge‬‬
‫عشان توصل لل ‪ node‬ي‬

‫الىل بتقطعه عشان توصل من مكان لمكان‪ ،‬أو السعر بتاع‬ ‫ممكن تعتت ال ا‪ weight‬ده عبارة عن الزمن ي‬
‫ال‪ item‬دي مثًل‪.‬‬
‫ا‬
‫الفكرة أن األلجورذم ده بيساعدك توصل القرص طريق‪ ،‬او تعمل ‪ minimize‬لقيمة معينة‪ ،‬مثًل ال ‪cost‬‬
‫عشان توصل من ‪ node‬للتانية‪ ،‬أو تعمل ‪ minimize‬لل ‪ distance‬وهكذا‪.‬‬
‫يمش فالكود‬ ‫وحن من رسح الكاتب مفهمتش حاجة غت لما هو بدأ‬ ‫طريقة عمله لألسف مش بسيطة ر‬
‫ي‬
‫ن‬
‫ألب‬ ‫ن‬
‫خطوة خطوة ويشحه بالصور و حط القيم بتاعة كل متغت يف الكود‪ ،‬هحط الصور دي لالسف كاملة ي‬
‫ً‬
‫أبدا‪.‬‬ ‫ن‬
‫إب أقدر أرسح الموضوع بطريقة أحسن من كدا بالكتابة‬‫مظنش ي‬
‫بس هو حاجة الزم تتعرف األول قبل ما نشوف الكود والخطوات بتاعته‪ ،‬انت بتحتاج ‪:hash tables ٣‬‬
‫الىل‬ ‫ن‬
‫تاب‪ ،‬و ال ‪ weights‬ي‬
‫‪ -١‬للجراف كله‪ ،‬بيتكون من ‪ nodes‬كلها وكل النودز دي مرتبطة ب ‪ nodes‬ايه ي‬
‫ربتبطهم ببعض‪.‬‬

‫‪ -٢‬لل ‪ costs‬او ال ‪ weights‬من نقطة البداية لكل ال ‪ nodes‬التانية‪ ،‬وده هنستخدمه ن يف إننا نسجل اقل‬
‫‪ cost‬عشان نوصل لل ‪ node‬دي‪.‬‬

‫‪ -٣‬لل ‪ ،parents‬و هو هنستخدمه عشان نقول انا وصلت من هنا لهنا ولقيت ان ده أقل ‪ cost‬فعشان‬
‫ّ‬
‫نعدل فيه‪.‬‬ ‫مني و روحت ن‬
‫أحفظ أنا بدأت ن‬
‫في بأقل قيمة‪ ،‬الزم يكون عندنا الجدول ده عشان‬

‫بالنسبة لكود األلجورذم‪:‬‬

‫ال فاألول‪:‬‬ ‫ا‬


‫ال بياخدها األلجورذم بناء عىل الجراف ي‬
‫وهنا الخطوات ي‬
‫من عيوب األلجورذم ربق انه مبيشتغلش غت لو كل ال ‪ weights‬تكون موجبة‪ ،‬مش بيشتغل لو ن يف‬
‫تاب اسمه ‪،Bellman-Ford‬‬ ‫ن‬ ‫ن‬ ‫ن‬
‫‪ weight‬سالب‪ ،‬يف حالة ان يف ‪ weights‬سالبة بنستخدم ألجورذم ي‬
‫الكاتب متكلمش عنه بس ممكن أحط لينك رسح ليه هنا للمهتم‪Bellman-Ford .‬‬
‫‪Chapter 8‬‬

‫الشابت ده الكاتب خلص كالم عن ال‪ graphs‬و بدأ يتكلم عن ال‪ ،greedy algorithms‬و هو نوع‬ ‫ر‬ ‫ن يف‬
‫ً‬
‫رياضيا إننا نعمل‬ ‫الىل بنستخدمه عشان نوصل ل‪ ،local solution‬أو‬ ‫بسيط جدا من األلجورذمز ي‬
‫الىل ملهاش حل ‪exact‬‬ ‫الىل عاوزينه‪ ،‬وبنستخدم الطريقة دي عشان نحل المشكالت ي‬ ‫‪ estimation‬للناتج ي‬
‫منطق‪.‬‬ ‫ر‬ ‫تقرين‬ ‫فبنوصل لحل‬
‫ا‬ ‫ي‬ ‫ي‬
‫ً‬
‫زي ما قولت انه بسيط جدا فهو ممكن أي مشكلة تحلها بيه بسهولة وبساطة‪ ،‬زي مثًل عاوز تعرف أقرص‬
‫وتمش ألقرب نقطة ليها‪ ،‬ثم أقرص نقطة ليها‪،‬‬ ‫ي‬ ‫طريق تاخده عشان توصل لنقطة ما‪ ،‬فهتبدأ ن يف نقطة‪،‬‬
‫وهكذا‪ ،‬لحد متوصل للنهاية‪.‬‬
‫الىل‬
‫ايه أنواع المشاكل دي أو أشكالها؟‪ ،‬هو يقدر يتحل بيه أي مشكلة زي ما قولنا من نوع ‪ NP-complete‬ي‬
‫ه زي مشكلة ال‪ salesman‬وكدا‪.‬‬ ‫ي‬
‫من المشاكل دي برضو إن يبق عندك ‪ set‬فيها مجموعة عنارص و‪ set‬تانية وتالتة وهكذا‪ ،‬وأنت بتحاول‬ ‫ر‬
‫ا‬
‫توصل ل‪ combination‬معينة بينهم‪ ،‬تحت رسوط وقواعد محددة‪ ،‬زي مثًل إنك عندك أكونتات أفراد‪،‬‬
‫الىل عنده‬ ‫ن‬
‫كل فرد فيهم ليه ‪ ،set of preferences‬وأنت بتحاول تقسم بي األفراد دول حسب ي‬
‫بي كل أكونت‬ ‫التاب‪ ،‬عشان تحل مشكلة زي دي محتاج تحسب مدى التشابه ن‬ ‫ن‬ ‫ر‬
‫‪ preferences‬أكت مع ي‬
‫هيخىل عدد‬ ‫والتاب‪ ،‬وده‬ ‫ن‬ ‫والتاب‪ ،‬وده هيحتاج إنك تحسب رقم بيعت عن التشابه أو االختالف ن‬
‫بي كل فرد‬ ‫ن‬
‫ي‬ ‫ي‬ ‫ي‬
‫الىل عندك‪.‬‬ ‫ً‬
‫االحتماالت مهول وكبت جدا‪ ،‬بزيادة عدد العنارص ي‬
‫مي أشبه شخص بيه‪،‬‬ ‫تبن زي ‪ ،hierarchy‬تمسك شخص "‪ "local‬وتشوف ن‬ ‫ن‬
‫حل لمشكلة زي دي‪ ،‬إنك ي‬
‫مي أشبه شخص بالشخص ده‪ ،‬وهكذا‪.‬‬ ‫خالص وصلتله؟ تروح تشوف ن‬
‫معي ‪-‬الىل نف الحالة دي هو الشبه‪ ،‬ر‬
‫أكت‬ ‫ن‬ ‫تبن زي بناء أو خطوات‪ ،‬كل خطوة بتتبع ‪constrain‬‬ ‫بحيث إنك ن‬
‫ي ي‬ ‫ي‬
‫الىل بدأت بيه‪ ،‬و قولنا ن يف‬ ‫ا ر‬ ‫ر‬ ‫ن‬
‫بالتاب‪ ،-‬و آخر شخص ده بيبق فاألغلب فعًل أكت شخص مش شبه ي‬ ‫ي‬ ‫حد شبه‬
‫تاب قريب منه او حواليه‪.‬‬ ‫ن‬
‫األغلب عشان أنت ممكن لو بدأت بداية تانية يطلع الناتج شخص ي‬
‫األلجورذم بسيط وسهل بيعتمد إنه يختار أضمن اختيار أو أعىل اختيار ن يف العائد ‪-‬عىل حسب الشوط‬
‫يعن بدل ما يحسب‬ ‫ن‬
‫بتاعة المشكلة‪ ،-‬وده السبب انه بيخليه ‪ estimator‬مش بيطلع القيمة الفعلية‪ ،‬ي‬
‫والتاب‪ ،‬ال هو بيمسك عنرص ويختار أقرب عنرص ليه بيحقق العالقة و بعدها ياخد‬ ‫ن‬ ‫بي كل عنرص‬ ‫العالقة ن‬
‫ي‬
‫أقرب عنرص للعنرص ده وهكذا‪.‬‬

‫الخالصة ربق‪:‬‬

‫‪ -‬مش بتستخدم ال‪ greedy approach‬ده غت لو مشكلتك كبتة وإنك تحسب حلها هياخد وقت كبت‬
‫الىل مش محتاج ال‪ exact solution‬وإنك ممكن تقبل ب‪ estimate‬بس‪.‬‬ ‫ً‬
‫جدا‪ ،‬ن‬
‫ي‬ ‫المشاكل‬ ‫وف‬
‫ي‬
‫‪ -‬لو عندك مشكلة ‪ NP-complete‬ر‬
‫يبق أحسن حل إنك تستخدم ‪greedy approach‬‬

‫ر‬
‫اآلب‪:‬‬
‫و مشاكل ال‪ NP-complete‬ممكن تعرفها من ي‬
‫ً‬
‫‪ -‬لو ن يف ألجورذم كان شغال حلو ورسي ع معاك عادي‪ ،‬ولما زودت الداتا لقيت الشعة قلت بشكل كبت جدا‬
‫و‪.exponentially‬‬

‫‪ -‬لو لقيت إنك محتاج عشان تحل المشكلة بتاعتك تحسب كل االحتماالت الممكن حدوثها‪all ،‬‬
‫‪ً ،possible values of X‬أيا كانت ‪ X‬دي ايه‪.‬‬

‫‪ -‬لو لقيت إن عندك ‪ sequence‬أو ‪ set‬من القيم و بتحاول توصل لعالقة ن‬


‫بي القيم دي‪ ،‬أو بتحاول‬
‫ن‬
‫معي أو "‪ "constraints‬أنت بتحاول تطبقها عىل القيم‪.‬‬ ‫تجاوب عن سؤال‬
‫‪Chapter 9‬‬

‫ً‬ ‫نف ر‬
‫شابت ‪ ٩‬الكاتب بيتكلم عن ال ‪ dynamic programming‬وهو موضوع تقيل جدا وملهوش ملكة‬ ‫ي‬
‫يعتت‪ ،‬كله واحد ممكن يحله بطريقة وملهوش خطوات ثابتة يتمش عليها‬
‫هو طريقة تفكت لحل مشاكل معينة‪ ،‬والمشاكل دي أغلبها ر‬
‫بتبق مشاكل تعتمد عىل إنك بتحاول تعمل‬
‫ن‬ ‫ن‬ ‫ا‬
‫معي‪،‬‬ ‫معي أو ظرف‬ ‫‪ ،constrained optimization‬مثًل قيمة بتحاول تخليها ‪ max/min‬تحت رسط‬
‫والطريقة دي بتخليك تقدر تكتب انت ‪ algorithms‬مخصصة لمشكلتك دي‪ ،‬عن طريقة تجزيء‬
‫الىل وصلتله توصل لحل المشكلة األصلية‪.‬‬
‫المشكلة دي لمشاكل أصغر تقدر تحلها بسهولة ومن ي‬

‫طب نتكلم عن الطريقة دي مبنية عىل ايه‪ ،‬أو أساسياتها ايه‪:‬‬

‫‪ -١‬بتحول المشكلة لجدول ‪.grid‬‬

‫ه دي المشاكل‬
‫الىل أنت بتحاول تعمل لها ‪ ،optimization‬وتقدر تعتتها ي‬
‫ه القيم ي‬
‫‪ -٢‬قيم ال‪ cells‬ي‬
‫الصغتة أو ال‪.-sub-problems‬‬

‫بتبق عبارة عن المتغت بتاعك‪ ،‬وده بيختلف من تطبيق ن‬


‫للتاب‪.‬‬ ‫‪ -٣‬المحاور بتاعة الجدول ر‬
‫ي‬

‫‪ -٤‬تحل الجدول ده و تمأل القيم وتحاول تشوف طريقة تكتب بيها الخطوات دي ن يف ‪loop / if‬‬
‫‪.conditions‬‬

‫الىل بتكتب ال‪algorithm‬‬


‫وبسبب آخر خطوة دي قولت إنها طريقة تفكت مش ‪ ،algorithm‬إلنك أنت ي‬
‫عىل حسب أنت عاوز ايه بظبط وجدولك بيتحل ازاي‪.‬‬
‫ا‬
‫ضباب أنا عارف‪ ،‬مثًل عندك يا سيدي كلمة مكتوبة غلط‪ ،‬وبتحاول توصل‬ ‫ي‬ ‫مثال ربق عشان الموضوع ربق‬
‫الىل كنت قاصدها‪.‬‬
‫للكلمة الصح ي‬
‫بي الكلمة الغلط المكتوبة ن‬
‫وبي الكلمات التانية القريبة منها‪ ،‬وأشوف عدد‬ ‫الكاتب قالك انا هعمل الجدول ن‬
‫ه دي الكلمة الصح‪.‬‬ ‫ن‬
‫الحروف المتشابهة بي كل كلمة والتانية واختار أعىل قيمة عىل إن ي‬

‫ن‬
‫التاب ‪for word in -‬‬
‫‪ -‬خىل المحاور عبارة عن حروف الكلمة بتاعتك وحروف الكلمة التانية عىل المحور ي‬
‫‪ - close_words‬حاجة زي كدا‪.‬‬

‫ن‬
‫الكلمتي‪ ،‬أو عدد الحروف المتكررة ورا بعض‪.‬‬ ‫‪ -‬خىل قيم ال‪ cells‬هو عدد الحروف المتكررة ن‬
‫بي‬
‫ن‬
‫وف االخر وصل ل‪ algorithm‬من سطرين‪ ،‬وبيكون الحل‬ ‫فضل يحسب ربق لكل جدول‬
‫الىل فيه ي‬
‫القيم ي‬
‫ا‬
‫معتمد عىل طريقة ال‪ ،grid‬فمثًل‪:‬‬

‫‪If word_a[i] == word_b[j]:‬‬


‫‪Cell[i][j]= cell[i+1][j+1] + 1‬‬

‫إلخ‪..‬‬
‫ن‬
‫الىل مأل بيها الجدول يف األساس‪.‬‬ ‫ن‬
‫الفكرة مش يف الكود هنا‪ ،‬الفكرة انه كتبه عىل حسب الطريقة ي‬
‫ن يف اآلخر الكاتب بيعرض بعض استخدامات الطريقة دي ن يف حل مشاكل ال‪ ،common sub-sequence‬و‬
‫ر‬
‫تالف ال‪pattern‬‬
‫الن شبه بعض‪ ،‬اعتتها مشكلة ‪ similarity‬وبتحاول ي‬ ‫ه نفس نوع مشكلة الكلمات ي‬ ‫ي‬
‫وسط الحاجات عشان تقارن بينها‪.‬‬

‫مي ربق بيستخدم ال‪ dynamic programming‬عد معايا‪:‬‬


‫زي ن‬

‫ا‬
‫أوًل الناس بتوع البايو وهم بيقارنوا ال‪ DNA‬لحيوانات مختلفة او ألمراض مختلفة‪.‬‬

‫ً‬
‫ثانيا حاجة زي ‪ git‬أو ‪ google doc‬لما بيوريك أنت غتت أو عدلت أد ايه من ال‪ version‬القديمة للفايل‬
‫ده‪ ،‬ويقولك غتت ايه بالظبط‪.‬‬

‫ثالثا ألجورذم معروف اسمه ‪ levenshtein distance‬ودي طريقة بتعرف بيها ال‪ similarity‬ن‬‫ً‬
‫بي نص‬
‫والتاب‪ ،‬وبيستخدم ن يف ال‪ spell-checking‬وال‪ ،copyrighted material‬ومش بعيد يكون بيستخدم ن يف‬
‫ي‬
‫ن‬
‫العلم ده مشوق وال أل‪.‬‬
‫ي‬ ‫ال‪ plagiarism‬عشان يحدد هل البحث‬

‫ابعا مش مجرد مشاكل ال‪ ،similarity‬عندك برضو ‪ doc/word‬بيستخدموها عشان يعملوا ‪wrap‬‬ ‫ر ً‬
‫تنته ن يف السطر بنفس المسافة‪ ،‬فهنا أنت بتحاول تعمل‬
‫ي‬ ‫للكالم وينظموه بحيث إن الكلمات تبدأ و‬
‫يعن‪-‬‬‫ن‬
‫‪ optimize‬ألبعاد النص فالصفحة ‪-‬غالبا ي‬
‫ً‬
‫ر‬
‫هيبق زي‬ ‫الخالصة إن ال‪ dynamic programming‬موضوع تقيل جدا‪ ،‬وأنا ن يف االول فكرته‬
‫أكت بسبب موضوع ال‪ ،cells-grid‬وإنك الزم تحل المشكلة بإيدك وتحاول‬ ‫ال‪ recursion‬بس طلع معقد ر‬
‫رتتجم الخطوات بتاعتك ل‪ code‬و‪ steps‬لأللجورذم‪.‬‬
‫‪Chapter 10‬‬

‫لقلن وهو متعلق بال‪ machine learning‬بشكل عام وبيدي لمحة عن‬
‫ي‬
‫ر‬
‫الشابت المقرب‬ ‫نتكلم ربق ن يف‬
‫تفاصيله باستخدام ‪.k-nearest neighbors‬‬

‫ايه هو ال ‪knn‬؟‬
‫هو موديل بسيط تقدر تعمل بيه ‪ classification‬أو ‪.regression‬‬

‫طب ايه دول؟‬


‫ال‪ classification‬هو ببساطة انك تحدد نوع أو عالقة معينة‪ ،‬مثال ده كلب وال قطة‪ ،‬نوع الفاكهة تفاح‬
‫وال مانجا‪ ،‬وهكذا‪.‬‬
‫ن‬
‫يعن يف ال ‪ classification‬فانت‬‫ن‬
‫أما ال‪ regression‬ف هو انك تقول قيمة عددية ‪ ،continuous‬ي‬
‫عندك ‪ classes‬محددة بتختار واحد منهم عشان تطلعه ك ‪ ،output‬أما هنا فانت بتطلع قيمة عددية‬
‫ا‬
‫ممكن من صفر لماال نهاية او من سالب ماال نهاية لماال نهاية‪ ،‬زي مثًل سعر سلعة‪ ،‬أو درجة حرارة‪.‬‬

‫طب ليه ‪knn‬؟‬


‫جدا جدوا‪ ،‬بيعتمد عىل انه بيشوف ال‪ input‬ده موقعه ن‬ ‫ً‬
‫الىل هو شافها‬
‫ي‬ ‫في بالنسبة لكل الداتا‬ ‫النه بسيط‬
‫ا‬ ‫ن‬
‫الىل داخلة دي يف ‪ input space‬ويقارنها بكل الداتا التانية‪ ،‬ويشوف مثًل‬ ‫قبل كدا‪ ،‬كأنه بيعمل ‪ plot‬للداتا ي‬
‫انت محدد قيمة ‪ k‬بكام ‪-‬فلنقل ‪ ، -٥‬ف هو ساعتها هتوح يشوف أقرب ‪ ٥‬قيم للنقطة الجديدة‪ ،‬و يشوف‬
‫قيمتها‪/‬نوعها ايه‪ ،‬و عىل األساس ده بيحدد قيمة‪/‬نوع الداتا الجديدة‪.‬‬
‫الىل قائم عليهم الموديل‪:‬‬ ‫ن‬
‫بس فيه نقطتي الزم تفهمهم عشان هم دول ي‬
‫الىل بتحددهم‬ ‫ن ر‬ ‫ن‬
‫يعن بتقارن فاكهتي يبق من الصفات ي‬ ‫الىل داخلة‪ ،‬ي‬ ‫ه البيانات ا ي‬‫‪ -١‬أهمية ال‪ ،features‬و ي‬
‫اللون والشكل‪ ،‬متجيش تدخل انت مثًل تاري خ الحصاد بتاعها‪.‬‬
‫ا‬
‫الىل عملها ريت‬
‫الىل عجبت العميل أو ي‬ ‫لو بتعمل ‪ recommendation‬مثًل ألفالم‪ ،‬فبتشوف الحاجات ي‬
‫ه‬ ‫ر‬
‫الىل ممكن تبق مش مهمة ي‬ ‫عال‪ ،‬او ال‪ preferences‬بتاعته أو الفئة العمرية‪ ،‬لكن من الحاجات ي‬ ‫ي‬
‫مساب‪ ،‬وهكذا‪.‬‬
‫ي‬ ‫صباج وال‬
‫ي‬ ‫شيفت العمل بتاعه‬

‫‪ -٢‬عىل أي أساس بتحسب القرب والبعد والمسافة؟‬


‫ن‬
‫بي صفة ونفسها يف النقطة التانية‪،‬‬ ‫أبسط اجابة ممكن تكون بقانون فيثاغورث جذر و تحتيه الفرق تربيع ن‬
‫تماما لو جذر (‪)١-٠(+)٢-١‬‬‫مختلفي ً‬
‫ن‬ ‫ن‬
‫إجابتي شبه بعض بالظبط مع انهم‬ ‫بس دي ممكن لسهولتها تطلع‬
‫هيديك قيمة ولتكن ‪ ،x‬و برضو جذر (‪ )٤-٣(+)١-٠‬هيديك نفس القيمة‪ ،‬مع األخذ فاالعتبار ان‬
‫ال‪ features‬مرتبة‪.‬‬
‫عشان كدا فيه أنواع مختلفة من ال‪ distance metrics‬زي ال‪ ،cosine distance‬ودي بتستخدم ن يف‬
‫ن‬
‫القيمتي هما هما بس االتجاه معكوس‪.‬‬ ‫ن‬
‫نقطتي وبكده حلت العيب وعرفت ان اه‬ ‫حساب الزاوية ن‬
‫بي‬
‫و ده ‪ GIF‬بيوضح طريقة العمل بالخطوات‪.‬‬
‫الماشي لتننج بشكل عام زي ال‪ face recognition‬أو ال‪،OCR‬‬ ‫ن‬ ‫بعد كدا الكاتب ادى أمثلة الستخدام‬
‫وه التنبأ بأسعار‬ ‫ر‬
‫دلوقن ي‬
‫ي‬ ‫واتكلم عن أهمية ال‪ ،features‬و ادى مثال جميل لمشكلة ملهاش حل لحد‬
‫ن‬
‫الىل ممكن يأثر عىل سعر سهم ما يف المستقبل؟‬ ‫البورصة‪ ،‬ورسح الموضوع بشكل جميل ان بالنسبالك ايه ي‬
‫هل هو سعره قبلها بيوم؟ شهر؟ اسبوع؟ حال البلد المادي؟ حال الشكة المادية؟ استقاالت فالشكة‬
‫ً‬ ‫ا‬
‫الىل ممكن تأثر عىل التنبآت ن يف المستقبل كبت جدا‪،‬‬
‫ارهاب حصل مثًل؟‪ ،‬عدد المتغتات ي‬
‫ي‬ ‫مثال؟ عمل‬
‫بيبق مش سليم ونتيجته مش مرضية‪ ،‬وبكده عرض بشكل جميل تأثت‬ ‫ولذلك مشكلة زي دي حلها ر‬
‫الىل بتستخدمها عىل كفاءة ال‪ model‬بتاعك‪.‬‬‫ال‪ features‬ي‬
‫‪Chapter 11‬‬

‫شابت ‪ ١١‬ن يف الكتاب الرائع ده‪ ،‬الكاتب بيتكلم عن ‪ ١٠‬ألجورذمات‬ ‫السالم عليكم‪ ،‬نف آخر ر‬
‫شابت معانا ر‬
‫ي‬
‫ن‬ ‫ر‬
‫يعتتوا ‪ advanced‬وهو مشحهمش وال اتكلم عنهم وسايبهم ليك لو حابب تتعمق وتتعلم أكت يف حاجة‬
‫معينة فيهم‪ ،‬عىل حسب نطاق عملك واهتماماتك‪.‬‬

‫‪ -١‬ال‪:binary search trees‬‬


‫ن‬
‫الىل بيستخدم بدل ال‪ arrays‬يف التعامل مع الداتا (تخزين ‪ -‬بحث ‪ -‬مسح)‪ ،‬وهو‬
‫وهو نوع من ال‪ trees‬ي‬
‫وه فكرتها بسيطة حيث‬ ‫ن‬
‫أرسع من ال‪ array‬يف التخزين والمسح حيث انه )‪ O(log n‬من حيث الشعة‪ ،‬ي‬
‫ان كل ‪ node‬نف ال‪ tree‬بتحتوي قيمة وال‪ children‬بتوعها بيكونوا ن‬
‫اتني قيمة قبل ال‪ parent‬ودي عىل‬ ‫ي‬
‫الشمال‪ ،‬وقيمة بعد ال‪ parent‬ودي عىل اليمي‪.‬ن‬

‫وده بيوفر إنك كل شوية مش محتاج تعيد ترتيب ال‪ array‬لما تغت فالقيم بتاعتها‪.‬‬
‫غالبا ن يف حفظ الداتا بداخل ال‪ ،database‬ويوجد منه العديد من‬
‫واأللجورذم ده بيستخدم ً‬
‫ممتات وعيوب‪.‬‬‫ال‪ variations‬لكل منها ن‬

‫‪ -٢‬ال‪:Inverted indexes‬‬
‫ن‬
‫وهو ببساطة استخدام ال‪ hash tabels‬عشان تشت ل‪ index‬يف ‪ data structure‬تانية‪.‬‬
‫ا‬
‫الىل ظهرت فيها‬
‫ي‬ ‫الصفحات‬ ‫رقم‬ ‫عن‬ ‫بتعت‬ ‫‪value‬‬‫وال‬ ‫كلمة‪،‬‬ ‫عن‬ ‫بتعت‬ ‫‪key‬‬‫ال‬ ‫‪dictionary‬‬ ‫عندك‬ ‫مثًل‬
‫الىل انت‬
‫الىل بيقع فيه ال‪ value‬الحقيقية ي‬
‫الكلمة‪ ،‬انت لو دخلت الكلمة بتاعتك هيطلعلك ال ‪ index‬ي‬
‫ر‬
‫الىل‬
‫لىل بتدور جواه‪ ،‬وهتدخل ال‪ index‬ده‪ ،‬وساعتها هيطلعلك ي‬‫عاوزها‪ ،‬فهتوح عىل الكتاب‪/‬ال‪ doc‬ا ي‬
‫انت بتدور عليه‪.‬‬
‫ً‬
‫هو طريقة سهلة وبسيطة للبحث‪ ،‬و تعتت استخدام من استخدامات ال‪ hashing tabels‬عوضا عن انها‬
‫‪ algorithm‬مختلف‪.‬‬

‫‪ -٣‬ال‪:Fourier transform‬‬
‫ن‬ ‫ً‬ ‫ن‬
‫وهو أصعب حاجة ممكن تقابل طالب يف هندسة‪ ،‬بس حاجة مفيدة جدا يف مختلف المجاالت‪ ،‬فممكن‬
‫ا‬
‫الىل‬‫استخدامها لتحليل أي ‪ signal‬للمكونات بتاعتها‪ ،‬مثًل لو أغنية ف هيطلع كل ال‪ frequencies‬ي‬
‫طبعا بيستخدم ن يف‬
‫بتشكل األغنية دي‪ ،‬ويدي لكل ‪ frequency‬فيهم ‪ weight‬يعت عن أهميتها‪ ،‬وده ً‬
‫عمليات ال‪ compression‬زي ال‪ 3mp‬وصيغ الصور المختلفة‪ ،‬بحيث انهم بياخدوا ال‪frequencies‬‬
‫األصىل‪.‬‬
‫ي‬ ‫الباف النه مش مهم ن يف اعادة تكوين الملف‬
‫ر‬ ‫ن‬
‫األعىل يف ال‪ weigths‬وي هملوا ي‬
‫طبعا برضو بيستخدم ن يف حاجات مختلفة زي الصور و ال‪ sequential data‬وأي حاجة ممكن تتجزأ‬
‫ل‪ frequencies‬أصغر لما يتجمعوا يطلعوا الداتا األصلية‪.‬‬

‫‪ -٤‬ال‪:parallel algorithms‬‬
‫علم واسع‪ ،‬باختصار بيتكلم عن‬ ‫ي‬ ‫و ده شبه ال‪ dynamic programming‬كده‪ ،‬طريقة تفكت ومجال‬
‫كيفية تجزئة ال‪ algorithms‬عىل أجهزة مختلفة‪ ،‬بحيث ان الوقت المستغرق من ألجورذم شغال عىل‬
‫االتي ن يف االخر لما يخلصوا‬
‫ن‬ ‫جهاز واحد يقل لما نجزأه عىل جهازين‪ ،‬بحيث ان كل جهاز يعمل نص الشغل و‬
‫يتجمعوا أو يتعمل لشغلهم ‪.merge‬‬

‫ليه ده ‪ concept‬صعب؟‬
‫بسبب انك محتاج تدرس كويس تأثت العوامل المختلفة‪ ،‬زي لو عندك ‪ array‬من ألف عنرص‪ ،‬هتقسم‬
‫يعن لو معاك جهازين هتدي لكل واحد ‪٥٠٠‬؟‪ ،‬طب والوقت بتاع‬‫ن‬
‫العنارص بالتساوي عىل األجهزة؟ ي‬
‫ر‬
‫هيبق أد ايه مثال؟‬ ‫ال‪merge‬‬
‫معي؟ طب افرض فيه تاسك وقته أقل من التابن‬‫ن‬ ‫برضو لو عندك كذا ‪ task‬هتقسم لكل جهاز تاسك‬
‫ي‬
‫ن‬
‫التاب واقف مش بيشتغل‪.‬‬ ‫ر‬
‫بكتت‪ ،‬هتبق كدا شغال بجهاز اغلب الوقت والجهاز ي‬
‫الزم كل الحاجات دي تتحسب كويس‪ ،‬و عشان كدا هو ‪ field of study‬ألي حد مهتم بال ‪scalability‬‬
‫‪.and performance‬‬
‫‪ -٥‬ال‪:MapReduce‬‬
‫ن‬ ‫ن‬ ‫ً‬
‫ماليي‬ ‫الىل عندها‬
‫و ده ألجورذم مهم جدا فالتعامل مع ال‪ big data‬وبيستخدم يف ال‪ databases‬ي‬
‫العنارص‪ ،‬وبيستخدم ن يف ال‪ distributed systems‬ويعتت جزء من عائلة ال‪distributed algorithms‬‬
‫ً‬
‫جدا‪.‬‬ ‫والىل بتساعدك انك تقوم بعمليات كتتة جدا ف وقت قليل‬ ‫‪ ،‬ي‬
‫ن‬
‫عمليتي‪:‬‬ ‫وهو بيعتمد عىل‬
‫ا‬
‫وه انك تعمل ‪ map‬من حاجة لحاجة تانية‪ ،‬مثال بتعمل ماب من ‪array‬‬ ‫ي‬ ‫‪،‬‬ ‫‪mapping‬‬ ‫ال‬ ‫أوًل‬
‫يعن بتعدي عىل كل قيمة فال‪ array‬وتعمل عليها عملية حسابية موجودة ن يف ال‪،function‬‬ ‫ن‬
‫ل‪ ،function‬ي‬
‫فبكده بتدخل ‪ array‬وبتطلع ‪.array‬‬
‫ا‬ ‫ً‬
‫ثانيا ال‪ ،reduction‬وهو انك بتقلص حاجة كبتة لحاجة صغتة‪ ،‬مثًل من ‪ array‬لقيمة واحدة‪ ،‬كإنك‬
‫ا‬
‫بتعمل ‪ hashing‬ليها مثًل‪ ،‬فبتاخد ‪ array‬من قيم مختلفة وترمزلها بقيمة واحدة فقط‪.‬‬
‫ً‬
‫الطريقتي دول ن يف عمل عمليات كتتة جدا عىل أجهزة مختلفة ن يف وقت قليل‪ ،‬زي‬
‫ن‬ ‫وهو بيستخدم‬
‫ال‪ queries‬ن يف ‪.big data databases‬‬

‫‪ -٦‬ال‪:bloom filters & hyperloglog‬‬


‫و دول ألجورذمز بيستخدموا ن يف البحث جوا ‪ ،sets‬بس مش مجرد ‪ set‬بسيطة‪ ،‬ال بتستخدم للبحث ف‬
‫ا‬
‫ماليي العنارص‪ ،‬مثًل أسماء ال‪ usernames‬ن يف الفيسبوك‪ ،‬أو ال‪ unique search words‬ن يف‬ ‫ن‬ ‫‪ set‬جواها‬
‫أي ‪.search engine‬‬
‫الفكرة انهم يقدروا ببساطة يحتفظوا بال‪ set‬دي ن يف شكل ‪ hash tabel‬وساعتها لما يحبوا يشوفوا هل‬
‫هيبق وقت البحث( ‪ ، 1(O‬بس المشكلة هنا مش ن يف الشعة‪ ،‬الفكرة ن يف‬‫ر‬ ‫االسم موجود عندنا؟ ساعتها ده‬
‫الىل مش دايما‬ ‫ر‬ ‫ن‬
‫الكمية‪ ،‬عشان تحفظ ‪ hash tabel‬جواه ماليي العنارص يبق محتاج مساحة مهولة‪ ،‬وده ي‬
‫بيكون متاح‪ ،‬انت بتحاول تحل مشكلة المساحة هنا‪.‬‬
‫طب ايه الحل؟‬
‫ن‬
‫بكل بساطة انك تستخدم ألجورذم يديك ‪ probability‬تقريبية‪ ،‬هل العنرص ده موجود عندي يف ال ‪set‬‬
‫يعن يقولك هو‬ ‫ن‬
‫الىل بيعمله ال‪ ،bloom filter‬من عيوبه انه ممكن يديك ‪ False positive‬ي‬ ‫وال أل؟ و ده ي‬
‫يعن لو قالك مش عندنا‬ ‫ن‬
‫اه عندنا‪ ،‬مع انه مش موجود‪ ،‬و من مزاياه انه عمره مهيطلع ‪ ،false negative‬ي‬
‫يبق ‪ ٪١٠٠‬مش موجود‪.‬‬ ‫ر‬
‫أما ال ‪ hyperloglog‬ده فهو بيعمل زي البلوم بظبط لكن بيشتغل عىل ‪ subset‬من ال‪ set‬بتاعتك‬
‫وبيطلع الناتج بدقة ر‬
‫أكت‪.‬‬
‫مترص لو اشتغلت ب‪ probability‬أو ‪،approximation‬‬ ‫واالتني دول بتستخدمهم نف حالة انك مش ن‬
‫ن‬
‫ي‬
‫عشان كده اسمهم ‪.probability algorithms‬‬

‫‪ -٧‬ال‪:SHA algorithms‬‬
‫معي‪ ،‬كانك بتعمل ‪ encryption‬للداتا‬‫ن‬ ‫وده يعتت ‪ hashing function‬بتستخدم لتحويل داتا إل ‪hash‬‬
‫دي بطريقة معينة‪.‬‬
‫ا‬ ‫ن‬ ‫بتقدر ً‬
‫ملفي شبه بعض وال أل‪ ،‬هل حصل فيهم تغيت؟‪ ،‬مثًل‬ ‫طبعا تستخدم األلجورذم ده عشان تقارن‬
‫الىل دخلته ده صح وال غلط؟ مش هتقارن الباسورد‬ ‫جوجل بتستخدمه عشان تعرف هل الباسورد ي‬
‫بالىل موجود عندك‪ ،‬ال بتقارن ال ‪ SHA‬بتاعك بال ‪ SHA‬المسجل عندهم‪.‬‬ ‫ر‬
‫الحقيق ي‬
‫ي‬
‫الىل مدخلها‪ ،‬مش‬ ‫ممتات ال‪ SHA‬انه مش بيتأثر ببساطة‪ ،‬ن‬ ‫و من ن‬
‫حرف واحد من الكلمة ي‬
‫ً‬
‫يعن لو غتت‬ ‫ي‬
‫معن كدا ان ال‪ SHA‬بتاعها ر‬
‫هيبق شبه الكلمة األصلية‪ ،‬ال إطالقا كل داتا ليها ‪ SHA‬مختلف‪ ،‬بس‬ ‫ن‬
‫مجي استخدموا ‪ SImHash‬وده فيه الخاصية بالعكس‪ ،‬ان لو غتت حرف واحد ال‪ SHA‬بتاعها‬ ‫المت ن‬
‫ً‬ ‫ر‬
‫هيبق مقارب جدا للكلمة األصلية‪ ،‬وده بيستخدموه زي كاشف لحقوق الملكية وال ‪.plagerism‬‬

‫‪ -٨‬ال‪:Diffie-Hellman key exchange‬‬


‫ن‬
‫المستخدمي‪ ،‬هو‬ ‫و ده ألجورذم بيستخدم ن يف ال‪ ،encryption‬وحل مشكلة ازاي أحافظ عىل األمان بتاع‬
‫ن‬
‫الطرفي‬ ‫مدخلش ن يف تفاصيل أوي‪ ،‬بس الخالصة انه انت بتحتاج مفتاح عشان تفك أي شفرة‪ ،‬و بيكون‬
‫ا‬
‫الىل بيتناقلوا المعلومات معاهم المفتاح ده عشان يحلوا الشفرة ويرجعوا المعلومات ألصلها‪ ،‬فمثًل لو‬
‫ي‬
‫ر‬
‫المفتاح ده عبارة عن ان كل حرف مكتوب بال‪ ،binary‬فعشان تفك الشفرة هتجع ال‪ binary‬لحروف‬
‫ً‬
‫وشكرا‪.‬‬
‫فتة و كدا‪،‬‬‫تغته كل ر‬
‫فكرة األلجورذم ده ربق عشان يحل مشكلة ان ممكن المفتاح ده يتشب وبيكون الزم ر‬
‫مفتاحي‪ ،‬مفتاح ‪ public‬وده بتستخدمه عشان تعمل ‪ ،encryption‬ومفتاح ‪ private‬وده‬ ‫ن‬ ‫انه استخدم‬
‫بتستخدمه عشان تعمل ‪ ،decryption‬المفتاح ال‪ public‬بيكون متاح لكل ال‪ ،users‬أما المفتاح‬
‫الىل بيتناقلوا المعلومات بس‪.‬‬ ‫ن‬
‫ال‪ private‬فده مش موجود غت مع الطرفي ي‬

‫‪ -٩‬ال‪:Linear programming‬‬
‫لىل بنفكر بيها لما بنكون عاوزين‬ ‫ن‬
‫وتاب ده ال يعتت ألجورذم‪ ،‬بس هو طريقة تفكت منهجية‪ ،‬و دي الطريقة ا ي‬
‫ي‬
‫الىل اتبعناها ن يف ال‪graphs‬‬ ‫ن‬
‫نعمل ‪ maximization‬لحاجة معينة يف وجود ‪ ،constraints‬ودي الطريقة ي‬
‫عشان نوصل ألقرص طريق أو أعىل رب ح ممكن ناخده‪.‬‬
‫وأضاف الكاتب ان ال‪ linear programming‬بتستخدم ال‪ ، simplex algorithm‬وهو ألجورذم معقد‪،‬‬
‫ً‬
‫لكن مهم جدا ألي حد مهتم بمشاكل ال ‪.optimization‬‬
‫و بكده نكون ختمنا كتاب ‪ Grokking Algorithms‬بحمد هللا‬

You might also like