هل PHP مناسبة لهياكل البيانات والخوارزميات؟
لتعلّمها، نعم، بشرط أن تتخلى عن عادة واحدة: اللجوء إلى array في كل شيء. مصفوفة PHP مرنة بما يكفي لتكون قائمة وقاموساً ومكدساً، وهذا بالضبط ما يُخفي تكلفة كل عملية. ابنِ الهياكل بنفسك وستكون PHP لغة جيدة تماماً للتفكير في الخوارزميات، واللغة الطبيعية لمقابلتك إن كانت PHP عملك.
أي أصناف SPL تقابل أي هياكل بيانات؟
SplStack وSplQueue مكدس وطابور، وكلاهما مبني على SplDoublyLinkedList؛ وSplMinHeap وSplMaxHeap كومتان؛ وSplPriorityQueue كومة عظمى مرتبة حسب الأولوية؛ وSplFixedArray مصفوفة ثابتة الحجم بفهارس صحيحة تستهلك ذاكرة أقل من array. والـ array العادي هو جدول التجزئة لديك. ولا يوجد صنف للشجرة أو لشجرة البادئات أو للرسم البياني، لذا تكتبها بنفسك، في الخطوتين الأولى والثانية.
لماذا تكون array_shift بطيئة لتنفيذ طابور في PHP؟
لأنها بعد حذف العنصر الأول تعيد ترقيم كل المفاتيح الصحيحة المتبقية بدءاً من الصفر، ما يمسّ المصفوفة كلها: فالطابور المبني على array_shift يكلّف O(n) لكل عملية إخراج، وزمناً تربيعياً لتفريغه. استخدم SplQueue، أو احتفظ بفهرس للرأس داخل المصفوفة وقدّمه بدلاً من ذلك. وفي الخطوة الأولى تبني طابوراً بنفسك، وهي أضمن طريقة لترى الفرق.
هل sort() مستقرة في PHP؟
منذ PHP 8.0، نعم: sort() وusort() وasort() وسائر دوال الترتيب تحافظ على العناصر المتساوية بترتيبها الأصلي. وقبل 8.0 لم تكن تعد بذلك، لذا كان يمكن للشيفرة التي تعتمد على ترتيب العناصر المتساوية أن تتصرف بشكل مختلف بين الإصدارات. ومن خوارزميات الترتيب الثماني في الخطوة الثالثة، الترتيب بالدمج والترتيب بالإدراج مستقران، والترتيب السريع والترتيب بالكومة ليسا كذلك؛ وبعد هذه الخطوة تعرف السبب.
ما الدورات في هذا المسار التي لا تُدرَّس بلغة PHP؟
ثلاث دورات. البرمجة الديناميكية وسلسلة مقابلات Python تُدرَّسان بلغة Python، وعمليات البتات بلغة C++. وتجدها مُدرجة بعد الخطوات، ولكل منها رابط يفتحها بلغتها. جدول النتائج المحفوظة في PHP هو array مفاتيحه المسائل الفرعية. وهناك فخ عند نقل حيل البتات: إذا كان كلا معامَلي & أو | أو ^ سلسلتين نصيتين، تعمل PHP على قيم البايتات لأحرفهما وتعيد سلسلة نصية، لذا تأكد أولاً من أن القيم أعداد صحيحة.
هل أحتاج إلى معرفة PHP قبل بدء هذا المسار؟
الدوال والمصفوفات والحلقات والأصناف على الأقل، لأن العقدة تكون بطبيعة الحال كائناً فيه الخاصية $next. إن كانت هذه جديدة عليك، فدورة PHP من Coddy توصلك إلى ذلك أولاً مجاناً، ويبدأ هذا المسار من حيث تنتهي.