من أحد المترجمين: ننشر اليوم
مقالة لك بقلم
Fabian Terh . ستكون المقالة مفيدة بشكل أساسي للمبرمجين المبتدئين.
أنا مبرمج علمي ، هذا المنشور يعكس تجربتي الشخصية ومهاراتي في مجالات مثل الخوارزميات وهياكل البيانات ؛ بالإضافة إلى ذلك ، أنا أتحدث عن طرق لحل المشاكل (بالمناسبة ، يتم إعطاء الثاني لي أسوأ إلى حد ما من الأول).
توصي Skillbox بما يلي: دورة عملية لمدة عامين ، "أنا مطور ويب للمحترفين" .
نذكرك: لجميع قراء "Habr" - خصم بقيمة 10،000 روبل عند التسجيل في أي دورة تدريبية في Skillbox باستخدام الرمز الترويجي "Habr".
المشكلة: أنت تعرف النظرية ، لكنك تواجه صعوبة في الممارسة
منذ وقت ليس ببعيد ، واجهت مشكلة يمكن وصفها بأنها "لا أعرف ما لا أعرفه" - يمكننا أن نقول فضولًا. الحقيقة هي أنني أفهم النظرية ، وبصورة جيدة. أعرف كيف تعمل القوائم ، وما هي العمليات المنفصلة ، وما هي أنواع البيانات المجردة ، وما إلى ذلك
لكن المشكلة هي أنني لا أعرف ما هي المعلومات التي يمكن أن تكون مفيدة لي في الممارسة العملية ، وليس لدي أي فكرة عما قد يكون مفقودًا لبعض المهام. لذلك ، من الصعب بالنسبة لي عندما أحتاج إلى حل بعض المشاكل.
أنواع المهام التي قد تجتمعمثال على سؤال حول بنيات البيانات: صف كيف يمكنك إدراج عقدة في قائمة مرتبطة وتحديد تعقيد الوقت.
إليك سؤالًا حول الخوارزميات: ابحث عن عنصر في صفيف مفروَز مدور وحدد تعقيد الوقت.
أخيرًا ، السؤال الأخير ، "المستوى" الأعلى من المستوى السابق ، هو طلب لوصف طريقة لحل المشكلة وسرد متطلبات تنفيذها.
في سياق العمل ، قد تحتاج إلى القيام بذلك ، أي وصف الحل. في البرمجة التنافسية ، غالبًا ما يكون من الضروري توفير رمز عمل دون تحديد أي بنية بيانات أو خوارزميات بشكل صريح. بمعنى آخر ، من المتوقع أن تكون قادرًا على استخدام هياكل البيانات والخوارزميات المثلى في كل حالة للحصول على الحل الأكثر فعالية للمشكلة.
كيف يمكنني تحسين مهاراتي؟
أنا شخصياً استخدمت ثلاثة موارد لهذا: HackerRank و LeetCode و Kattis. إنها متشابهة مع بعضها البعض ، خاصة الأولين ، لكنهما غير متطابقين.
أقسم المهارات اللازمة لحل المشكلات إلى ثلاث مجموعات:
- معرفة بنيات البيانات ؛
- معرفة الخوارزميات.
- القدرة على تطبيق هياكل البيانات والخوارزميات.
أول فئتين أساسيتان ، تقعان في القاع. الفئة الثالثة هي فئة أعلى.
معرفة بنيات البياناتكان HackerRank مكاني المفضل هنا. يحتوي على قسم مخصص لهياكل البيانات ، حيث يمكن تصفية المعلومات حسب النوع ، بما في ذلك الأشجار والقوائم المرتبطة والمصفوفات ، إلخ.
ترتبط المشكلات التي تمت معالجتها في HackerRank أساسًا بالعمل مع هياكل البيانات:
- المصفوفات: تدوير الصفيف وتنفيذ إجراءات أخرى معها.
- قوائم مرتبطة: عكس ، كشف دورة.
- الأشجار: تبادل العقدة ، BST المصادقة.
ربما كنت بالفعل فهمت ما كان الأمر. لا يمكن استخدام الأسئلة المقدمة من المورد مباشرةً في حل المشكلات. ولكن هناك حاجة لفهم الأساسيات ، والتي كانت مهمة للغاية في حالتي.
ليس لدى HackerRank "نموذج حل" متاح بشكل شائع ، على الرغم من وجود العديد من النصائح والحيل وحتى أجزاء من قانون العمل في قسم المناقشة. كل هذا ساعدني كثيرا.
معرفة الخوارزمياتيحتوي HackerRank على قسم به خوارزميات ، على الرغم من أن LeetCode أقرب إلي. يبدو لي أن قائمة المشكلات التي تمت معالجتها على المورد الثاني أوسع بكثير ، وهناك تفسيرات ونصائح.
من الأفضل أن تبدأ بـ 100 سؤال شائع (هذا القسم موجود على LeetCode). كان بعضها مفيدًا جدًا لي:
- دمج الحساب
- أكبر تزايد مستمر بعد.
- البحث في مجموعة فرز استدارة.
بخلاف المشكلات المتعلقة بهياكل البيانات ، ينصب التركيز هنا على كيفية القيام بشيء ما. على سبيل المثال ، ترتبط مشكلة دمج الحسابات أساسًا باستخدام خوارزميات UFDS القياسية. مشكلة البحث في صفيف مفروزة مستديرة هي دوران في بحث ثنائي. في بعض الأحيان يكون من الممكن إيجاد طرق جديدة نوعيًا لحل المشكلات - على سبيل المثال ، طريقة "النافذة المنزلق" لمشكلة أطول فترة متواصلة مستمرة. "
القدرة على تطبيق هياكل البيانات والخوارزمياتحسنًا ، لقد ضخت هذه المهارة بالفعل بمساعدة مورد Kattis. يوجد أرشيف ضخم للمشكلات التي تم حلها ، والذي يجمع البيانات من مصادر مختلفة ، بما في ذلك مسابقات المبرمجين من جميع أنحاء العالم.
لسوء الحظ ، لا يملك Kattis منتدى ، بالإضافة إلى الحالات الخاصة ، وليس الحالات الشائعة. لذلك ، هناك العديد من المشاكل التي لم أستطع حلها بمساعدته.
ومع ذلك ، يمكن أن يساعد مورد العديد من المبرمجين. أنا نفسي لم أقضي الكثير من الوقت في دراستها.
الموارد الأخرى
يعد Geeksforgeeks مورداً قيماً آخر للتعرف على الخوارزميات وهياكل البيانات. يعجبني أنه يوفر قصاصات بلغات مختلفة ، بما في ذلك C ++ و Java و Python. يمكنك استخدامها دون أي مشاكل.
وبالطبع ، هناك Google قديم جيد من YouTube.
الخاتمة
في الواقع ، فإن الشيء الرئيسي هو كتابة التعليمات البرمجية ، والانخراط في تصحيح الأخطاء ، ودراسة التعليمات البرمجية للمطورين الآخرين ، والتي سوف تساعدك على التعامل بسرعة مع المهام الحالية الخاصة بك. حل المشكلات أمر صعب ، ولكن مع كل محاولة ، ومع كل مشكلة تم حلها ، ستصبح أفضل وأفضل.