الدرس 8 من 8
التقاطع والفرق
- 12 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
من n×m إلى n+m
الشرح
«من سجّل في المادّتين؟» و«من سجّل في الأولى وحدها؟» سؤالان يتكرّران بصور كثيرة، مثل الوسوم المشتركة، والمعرّفات المحذوفة، والصلاحيات الناقصة.
والحلّ الذي يخطر أولًا هو a.filter(x => b.includes(x))، وهو يمرّ على b كاملة مع كل عنصر من a، فإذا كان في كل منهما ألف عنصر احتجت إلى مليون مقارنة. والأفضل أن تبني من b مجموعة Set مرّة واحدة، ثم تستعمل has مع كل عنصر، فتحتاج إلى ألفي خطوة بدل مليون.
والخطأ الشائع أن تبني المجموعة داخل الدالة التي تمرّرها إلى filter، فالكود a.filter(x => new Set(b).has(x)) يبني مجموعة جديدة مع كل عنصر، فيصير أبطأ من includes نفسها.
المطلوب
اكتب intersect(a, b) لتُرجع العناصر الموجودة في المصفوفتين، وdifference(a, b) لتُرجع ما في a وليس في b، على أن تحافظ الدالتان على ترتيب a، وتقرأ كلّ منهما b مرّة واحدة.
الفحوص
6 فحوص- الدالة intersect تُرجع العناصر المشتركة
- الدالة intersect تحفظ ترتيب المصفوفة الأولى
- الدالة difference تُرجع ما في الأولى وحدها
- المصفوفات الفارغة لا تسبّب خطأ في الدالتين
- الدالة intersect تقرأ الثانية مرّة واحدة
- الدالة difference تقرأ الثانية مرّة واحدة