Professional Documents
Culture Documents
ملخص كتاب Grokking Algorithms
ملخص كتاب Grokking Algorithms
شابت من كتاب " 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و دي تقدر تعتتها الفنكشن بق ال يىل بتكررها ،انك تزود واحد فالحالة دي.
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عندك:
ممكن تتخيل مشكلة انك بتحاول توصل لمكان ما ،فبتشوف انت لو واقف فالموقف و بتحاول تروح مكان
الىل انت عاوزه ده؟ ن ن
معي ،هل يف مواصلة تقدر توصلك للمكان ي
ولو فيه مواصالت تقدر توصلك ،فايه هو ابسط مواصلة ممكن تاخدها.
وتاكش ،و ممكن تركب
ي فممكن تركب ٣أتوبيسات عشان توصل للمكان ده ،وممكن تركب مشوع
ن ن
وف أسوأ الحاالت فأنت متواجد يف مكان معزول ن نن
الىل انت عاوزة ،ي
مواصلة واحدة بس تتلك يف المكان ي
ومش هتقدر تروح للوجهة بتاعتك دي.
ال من
تقدر تحول أي مشكلة بتواجهها ل ،graphو تطبق عليه األلجورذم ده عشان تجاوب عىل األسئلة ي
النوع ده.
ر
االب:
النهاب هيكون بالشكل ي
ي الكود
ن يف النهاية توصلنا الن رسعة األلجورذم ده -بما انه بسيط و بياخد كل االحتماالت المتاحة لحد ميوصل
ه( ،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فعشان
ّ
نعدل فيه. مني و روحت ن
أحفظ أنا بدأت ن
في بأقل قيمة ،الزم يكون عندنا الجدول ده عشان
الشابت ده الكاتب خلص كالم عن ال 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دي ايه.
ً نف ر
شابت ٩الكاتب بيتكلم عن ال dynamic programmingوهو موضوع تقيل جدا وملهوش ملكة ي
يعتت ،كله واحد ممكن يحله بطريقة وملهوش خطوات ثابتة يتمش عليها
هو طريقة تفكت لحل مشاكل معينة ،والمشاكل دي أغلبها ر
بتبق مشاكل تعتمد عىل إنك بتحاول تعمل
ن ن ا
معي، معي أو ظرف ،constrained optimizationمثًل قيمة بتحاول تخليها max/minتحت رسط
والطريقة دي بتخليك تقدر تكتب انت algorithmsمخصصة لمشكلتك دي ،عن طريقة تجزيء
الىل وصلتله توصل لحل المشكلة األصلية.
المشكلة دي لمشاكل أصغر تقدر تحلها بسهولة ومن ي
ه دي المشاكل
الىل أنت بتحاول تعمل لها ،optimizationوتقدر تعتتها ي
ه القيم ي
-٢قيم ال cellsي
الصغتة أو ال.-sub-problems
-٤تحل الجدول ده و تمأل القيم وتحاول تشوف طريقة تكتب بيها الخطوات دي ن يف loop / if
.conditions
ن
التاب for word in -
-خىل المحاور عبارة عن حروف الكلمة بتاعتك وحروف الكلمة التانية عىل المحور ي
- close_wordsحاجة زي كدا.
ن
الكلمتي ،أو عدد الحروف المتكررة ورا بعض. -خىل قيم ال cellsهو عدد الحروف المتكررة ن
بي
ن
وف االخر وصل ل algorithmمن سطرين ،وبيكون الحل فضل يحسب ربق لكل جدول
الىل فيه ي
القيم ي
ا
معتمد عىل طريقة ال ،gridفمثًل:
إلخ..
ن
الىل مأل بيها الجدول يف األساس. ن
الفكرة مش يف الكود هنا ،الفكرة انه كتبه عىل حسب الطريقة ي
ن يف اآلخر الكاتب بيعرض بعض استخدامات الطريقة دي ن يف حل مشاكل ال ،common sub-sequenceو
ر
تالف الpattern
الن شبه بعض ،اعتتها مشكلة similarityوبتحاول ي ه نفس نوع مشكلة الكلمات ي ي
وسط الحاجات عشان تقارن بينها.
ا
أوًل الناس بتوع البايو وهم بيقارنوا ال 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
شابت ١١ن يف الكتاب الرائع ده ،الكاتب بيتكلم عن ١٠ألجورذمات السالم عليكم ،نف آخر ر
شابت معانا ر
ي
ن ر
يعتتوا advancedوهو مشحهمش وال اتكلم عنهم وسايبهم ليك لو حابب تتعمق وتتعلم أكت يف حاجة
معينة فيهم ،عىل حسب نطاق عملك واهتماماتك.
وده بيوفر إنك كل شوية مش محتاج تعيد ترتيب ال 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
-٧ال:SHA algorithms
معي ،كانك بتعمل encryptionللداتان وده يعتت hashing functionبتستخدم لتحويل داتا إل hash
دي بطريقة معينة.
ا ن بتقدر ً
ملفي شبه بعض وال أل ،هل حصل فيهم تغيت؟ ،مثًل طبعا تستخدم األلجورذم ده عشان تقارن
الىل دخلته ده صح وال غلط؟ مش هتقارن الباسورد جوجل بتستخدمه عشان تعرف هل الباسورد ي
بالىل موجود عندك ،ال بتقارن ال SHAبتاعك بال SHAالمسجل عندهم. ر
الحقيق ي
ي
الىل مدخلها ،مش ممتات ال SHAانه مش بيتأثر ببساطة ،ن و من ن
حرف واحد من الكلمة ي
ً
يعن لو غتت ي
معن كدا ان ال SHAبتاعها ر
هيبق شبه الكلمة األصلية ،ال إطالقا كل داتا ليها SHAمختلف ،بس ن
مجي استخدموا SImHashوده فيه الخاصية بالعكس ،ان لو غتت حرف واحد ال SHAبتاعها المت ن
ً ر
هيبق مقارب جدا للكلمة األصلية ،وده بيستخدموه زي كاشف لحقوق الملكية وال .plagerism
-٩ال:Linear programming
لىل بنفكر بيها لما بنكون عاوزين ن
وتاب ده ال يعتت ألجورذم ،بس هو طريقة تفكت منهجية ،و دي الطريقة ا ي
ي
الىل اتبعناها ن يف الgraphs ن
نعمل maximizationلحاجة معينة يف وجود ،constraintsودي الطريقة ي
عشان نوصل ألقرص طريق أو أعىل رب ح ممكن ناخده.
وأضاف الكاتب ان ال linear programmingبتستخدم ال ، simplex algorithmوهو ألجورذم معقد،
ً
لكن مهم جدا ألي حد مهتم بمشاكل ال .optimization
و بكده نكون ختمنا كتاب Grokking Algorithmsبحمد هللا