هياكل البيانات الخطية في الواجهة الأمامية (Frontend Linear Data Structures)
تقوم هياكل البيانات الخطية بترتيب العناصر في تسلسل، حيث يكون لكل عنصر سلف (predecessor) وخلف (successor) واحد.
المصفوفات (Arrays)
المصفوفات هي الأداة الرئيسية في JavaScript. وهي تستخدم ذاكرة متصلة (contiguous memory)، مما يتيح لك الوصول إلى أي عنصر عبر فهرسه (index) بشكل فوري.
push: يضيف عنصراً إلى النهاية.unshift: يضيف عنصراً إلى البداية. هذه العملية بطيئة لأن كل عنصر آخر يجب أن يتحرك موضعاً واحداً إلى اليمين.splice: يضيف أو يزيل عناصر في أي موضع. تغير هذه الطريقة المصفوفة الأصلية، لذا فهي ليست دالة نقية (pure function).
ملاحظة: عندما تكبر المصفوفة بشكل كبير، يجب على JavaScript تخصيص كتلة ذاكرة أكبر ونسخ كل شيء إليها، مما يؤثر على الأداء.
المكدس (Stacks)
يتبع المكدس قاعدة LIFO: "ما يدخل أخيراً يخرج أولاً" (Last In, First Out). تخيل كومة من الأطباق؛ فأنت تضيف أو تزيل من الأعلى فقط.
push: الإضافة إلى الأعلى.pop: الإزالة من الأعلى.peek: عرض العنصر العلوي دون إزالته.
الطابور (Queues)
يتبع الطابور قاعدة FIFO: "ما يدخل أولاً يخرج أولاً" (First In, First Out). تخيل طابوراً في متجر.
push: الإضافة إلى الخلف.shift: الإزالة من الأمام.
تحذير: استخدام shift على مصفوفة يكون بطيئاً مع مجموعات البيانات الكبيرة، حيث يجب أن يتحرك كل عنصر إلى اليسار لملء الفراغ. للبيانات الضخمة، استخدم القائمة المرتبطة (linked list) بدلاً من ذلك.
القوائم المرتبطة (Linked Lists)
تتكون القائمة المرتبطة من عقد (nodes). تحتوي كل عقدة على بيانات ومؤشر (pointer) إلى العقدة التالية.
- المميزات: إضافة أو إزالة العقد عملية سريعة بمجرد العثور على الموضع المطلوب، حيث تقوم فقط بتغيير المؤشرات.
- العيوب: لا يمكنك القفز إلى فهرس معين؛ بل يجب أن تبدأ من الرأس (head) وتتبع المؤشرات واحداً تلو الآخر، وهذا أمر بطيء.
ملخص المقارنة:
- المصفوفات: الأفضل للقراءة المتكررة والبيانات الصغيرة. الوصول إليها هو O(1).
- القوائم المرتبطة: الأفضل لعمليات الكتابة المتكررة والبيانات الكبيرة. عملية الإدراج هي O(1) إذا كنت تملك العقدة.
نصائح احترافية لـ JavaScript:
- لا تخلط أنواع البيانات داخل المصفوفة؛ فالحفاظ على توحيد الأنواع يساعد المحرك على استخدام ذاكرة متصلة.
- استخدم دائماً دالة مقارنة (comparator function) عند فرز الأرقام. فمثلاً
[10, 2].sort()ستنتج[10, 2]لأنها تقوم بالفرز كأنها نصوص. - تذكر أن معظم طرق المصفوفات الأصلية (native methods) تقوم بتعديل المصفوفة الأصلية.