أبطال الأزهر الكرام نعلن اقتراب موعد التصفية الأولى، وهذا هو الأسبوع الأخير في شهر رمضان المبارك؛ فأحسنوا الختام، واستعدوا لاستكمال التدريب بعد عيد الفطر المبارك 😍🎈
الهدف من الأسبوع الثالث:
1- تعلم كيفية تحليل الخوارزميات (Complexity Analysis).
2- التعرف على "TLE" و أسباب حدوثه.
3- التعرف على مميزات وأهمية الـ Data Preprocessing.
4- نظرة سريعة على أهم الـ Preprocessing Techniques:
1- Frequency Array.
2- Prefix (Cumulative) Sum.
الأسبوع دا هو أهم أسبوع خلال التدريب:
- الفترة اللي فاتت كنا بنحل مسائل مباشرة وكان كل هدفنا إننا نوصل لحل للمسألة ونحول الحل بتاعنا لكود مظبوط عشان نوصل لـ Accepted لكن بداية من الأسبوع دا هنتعلم إن مش كفاية نركز على إن الحل بتاعنا يكون صح وبس.
- في مسابقات البرمجة أهم حاجة هي الـ Problem Solving Skills ، وأهم حاجة في مهارات حل المشاكل هي إنك تكون قادر على إيجاد حل صحيح وسريع (Correct and Efficient).
- هنعرف مدى أهمية إننا نركز على أداء (Performance) الخوارزميات (Algorithms) اللي بنكتبها لحل المسائل إلى جانب التركيز على صحة الحل (Correctness).
- يعني ايه أداء الخوارزمية (Performance of an algorithm) ؟ الأداء بيتحسب بناء على الـ Execution Time يعني الوقت اللي بياخده البرنامج عشان يتنفذ والـ Needed Memory وهي المساحة اللي بيحجزها البرنامج عشان يخزن المتغيرات المختلفة.
- هنتعلم ازاي نحسب البرنامج بتاعنا هياخد Time اد ايه وهنتعلم ازاي نقارن بين حلين مختلفين ونعرف انهي حل أسرع من الثاني.
- هنتعلم ازاي نعرف البرنامج بتاعنا بيستهلك اد ايه من الـ Memory.
- هنعرف كويس جدا إن الوقت بيفرق وإن كل مسألة ليها Time Limit محدد مينفعش البرنامج بتاعك يعدي الTime دا، ولو حصل وعديته هتلاقي الـ Judge بيقولك Time Limit Exceeded ولازم تفكر في حل أسرع.
- هنعرف كويس جدا إن الوقت بيفرق وإن كل مسألة ليها Memory Limit محدد مينفعش البرنامج بتاعك يعدي الـ Limit دا، ولو حصل وعديته هتلاقي الـ Judge بيقولك Memory Limit Exceeded ولازم تفكر في حل أفضل يحجز Memory أقل.
- هنتعلم ازاي نعرف الحل بتاعنا هيعدي ولا هيجيب TLE قبل ما نعمل Submit.
- هنتعلم ازاي نفكر في حلول غير تقليدية سريعة للمسائل.
- السطرين دول بيفرقوا جدا في السرعة بتاعت الكود ودا بيظهر لما الـ input أو الـ output يكون كبير جدا.
- السطرين دولا مهمين جدا وهيفرقوا معاك! ساعات الحل بتاعك هيكون سريع والفرق بينه وبين الـ TLE كبير جدا لكن يجيب TLE بسبب القراءة والطباعة البطيئة، وممكن تلف ساعة حوالين نفسك ومش عارف أنت بتجيب TLE ليه رغم إن الحل بتاعك سريع جدا.
- الهدف من الكلام دا إننا نقولك استخدمهم على طول في أي كود يعني خليهم ثابتين عندك في الEditor متشلهمش خالص.
السطرين:
cin.tie(0);
cin.sync_with_stdio(0);
ممكن تحطهم في function وتناديها دايما في أول الـ main زي كدا:
- هنعرف مفهوم جديد وهو الـ Data Preprocessing وأهميته ومدى تأثيره على الـ Complexity.
- كل Preprocessing Technique هنتعلمه هنعرف إنه بيساعدنا نجاوب على نوع معين من الأسئلة بطريقة Efficient جدا غالبا في:
Constant Time O(1)
- هنتعلم خلال الأسبوع دا Two Techniques مهمين جدا وإستخدامهم شائع ومتكرر وهما:
1- Frequency Array هيساعدنا نجاوب على Counting Queries بشكل Efficient.
2- Prefix (Cumulative) Sum هيساعدنا نجاوب على Range Sum Queries بشكل Efficient.
- مهم جدا تبقى واخد بالك إن الـ Techniques اللي هتتعلمها في الغالب مش هتكون كافية لحل المسألة ولكن بتستخدمها في جزء من الحل فقط، وبالتالي هي هتساعدك إنك تفكر وتكتب كود More Efficient.
- أكبر حد للـ array size في الـ C++ بيختلف حسب مكان الـ Declaration.
- لو عايزين نحجز array بـ size كبير بنعرفها global (قبل الـ main) ومسموح لينا نوصل لـ 100000000 (1e8) في معظم المسائل.
- لما بنعرف أي متغير global بياخد initial value حسب نوع المتغير، مثلا لو عرفت global array of integers كل العناصر هتكون بصفر مبدئيا ومش محتاج أصفرها.
سؤال للتفكير (بعد مشاهدة الفيديوهات وحل المسائل):
- لو عندنا مليون رقم والأرقام كبيرة جدا في رينج 10 أس 12 مثلا، ازاي نقدر نعمل Frequency Array تستوعب الأرقام دي؟ (احسب الـ Memory المطلوبة وشوف هل دا ممكن ولا مستحيل).