هل Ruby مناسبة لهياكل البيانات والخوارزميات؟
نعم، للتعلّم وللمقابلات في الشركات التي تعمل بـ Rails: الشيفرة قصيرة قِصر شيفرة Python، والكتل تجعل المرور على الهياكل يُقرأ كالخوارزمية نفسها. وهناك نقصان يستحقان المعرفة. فالمكتبة القياسية لا تحتوي على كومة ولا طابور أولوية ولا قائمة مترابطة ولا شجرة، لذا تكتبها بنفسك؛ وArray#sort لا تعد بالاستقرار، لذا حين يجب أن تحافظ العناصر المتساوية على ترتيبها، رتّب حسب زوج: sort_by.with_index { |x, i| [x, i] }.
أي أصناف Ruby تقابل أي هياكل بيانات؟
Array مصفوفة ديناميكية تؤدي دور المكدس (push وpop) والطابور (push وshift)؛ وHash جدول تجزئة يتذكر ترتيب الإدراج؛ وSet، في المكتبة القياسية، مجموعة قائمة على التجزئة. هذه هي القائمة كلها. ولا توجد كومة ولا طابور أولوية ولا قائمة مترابطة ولا شجرة ولا شجرة بادئات ولا رسم بياني، لذا تبنيها بنفسك، في الخطوتين الأولى والثانية.
كيف أكتب طابور أولوية في Ruby؟
لم تأتِ Ruby بواحد قط، لذا هناك ثلاث إجابات صادقة: رتّب المصفوفة بعد كل إدراج، بتكلفة O(n log n) لكل إضافة؛ أو أبقِها مرتبة باستخدام bsearch_index وinsert، بتكلفة O(n) لكل إضافة؛ أو اكتب كومة ثنائية فوق Array، بتكلفة O(log n) للإضافة والإخراج كليهما. والثالثة هي ما يبحث عنه مُجري المقابلة، وفي الخطوة الثانية تبنيها.
لماذا يهم ترتيب الإدراج في Hash بلغة Ruby عند كتابة الخوارزميات؟
لأنه يحوّل بعض التصاميم الكلاسيكية إلى بضعة أسطر. فذاكرة التخزين المؤقت LRU، وهي سؤال مقابلات مفضل، عبارة عن Hash تحذف فيه كل قراءة المفتاح ثم تعيد إدراجه لنقله إلى النهاية، والإخلاء هو shift، الذي يحذف أقدم مُدخل. وفي معظم اللغات يتطلب ذلك جدول تجزئة مع قائمة مترابطة مزدوجة، وهما الهيكلان اللذان تبنيهما في الخطوتين الأولى والثانية، فتستطيع أن تشرح ما تفعله Ruby نيابة عنك.
ما الدورات في هذا المسار التي لا تُدرَّس بلغة Ruby؟
ثلاث دورات. البرمجة الديناميكية وسلسلة مقابلات Python تُدرَّسان بلغة Python، وعمليات البتات بلغة C++. وتجدها مُدرجة بعد الخطوات، ولكل منها رابط يفتحها بلغتها. يمكن أن يكون جدول النتائج المحفوظة في Ruby Hash بكتلة افتراضية، كما في Hash.new { |h, n| h[n] = n < 2 ? n : h[n - 1] + h[n - 2] }، وn[i] تقرأ البت i من العدد الصحيح مباشرة، حيث تكتب C++ (n >> i) & 1.
هل أحتاج إلى معرفة Ruby قبل بدء هذا المسار؟
الدوال (methods) والكتل (blocks) والمصفوفات وجداول التجزئة (hashes) والأصناف على الأقل. إن كانت هذه جديدة عليك، فدورة Ruby من Coddy توصلك إلى ذلك أولاً مجاناً، ويبدأ هذا المسار من حيث تنتهي.