هياكل البيانات للمبتدئين: القوائم والقواميس والمجموعات

 

حين تكتب برنامجك الأول تتعامل غالبًا مع قيم مفردة: رقم هنا ونص هناك. لكن البرامج الحقيقية تتعامل مع مجموعات: قائمة أسماء العملاء، وأسعار المنتجات، وعناصر سلة الشراء، ورسائل المحادثة. وهنا تبرز الحاجة إلى هياكل البيانات، وهي طرق منظمة لتخزين مجموعات القيم وترتيبها والوصول إليها. واختيار الهيكل المناسب يؤثر في وضوح الكود وسرعته، فمن يخزن كل شيء في قائمة طويلة سيجد نفسه يبحث فيها عنصرًا عنصرًا في كل مرة، بينما يتيح له هيكل آخر الوصول المباشر. وأسماء هذه الهياكل وصياغتها تختلف بين اللغات، لكن الأفكار واحدة، ولهذا نشرحها هنا بمفاهيمها العامة مع تسميات شائعة في لغات مثل بايثون وجافاسكربت. وللتوضيح لن ندخل في تفاصيل الذاكرة الداخلية ولا الرياضيات الثقيلة، فغرضنا أن تعرف ما لديك من أدوات ومتى تستعمل كل واحدة. وقد مهد مقال المنطق البرمجي لفكرة التفكير في الكفاءة، ونطبقها هنا عمليًا.

لماذا نحتاج إلى هياكل البيانات؟

قبل الخوض في الأنواع، من المفيد أن تفهم المشكلة التي تحلها. فهي ليست ترفًا أكاديميًا:

  • تنظيم المعلومات: بدلًا من عشرة متغيرات منفصلة لعشرة أسماء، تضعها في قائمة واحدة تتعامل معها كوحدة. فيقل الكود ويسهل تعديله.

  • التعبير عن العلاقات: بعض البيانات لها ارتباطات، كاسم الطالب ودرجته. وهياكل معينة تعبر عنها مباشرة.

  • سرعة الوصول والبحث: اختيار الهيكل المناسب قد يجعل البحث فوريًا بدل أن يمر على كل العناصر. وفرق ذلك يظهر مع البيانات الكبيرة.

  • منع الأخطاء: هياكل مثل المجموعات تمنع التكرار تلقائيًا، فلا تحتاج إلى فحص يدوي.

  • وضوح النية: حين ترى قاموسًا تعرف أن الكود يربط مفاتيح بقيم، وهذا يشرح الغرض لمن يقرؤه.

  • أساس للتعلم المتقدم: قواعد البيانات والخوارزميات والواجهات كلها تقوم على هذه المفاهيم، فإتقانها استثمار طويل الأمد.

  • قدر معقول من الدقة: لا يلزم أن تعرف عشرين هيكلًا، فأربعة أو خمسة منها تغطي أغلب احتياجاتك اليومية.

القوائم: مجموعة مرتبة من العناصر

القائمة، وتسمى المصفوفة في بعض اللغات، أشهر الهياكل وأبسطها. وهي سلسلة مرتبة من القيم يمكن الوصول إلى كل منها برقمها:

  • الفكرة: عناصر متتابعة لكل منها موضع، تبدأ المواضع في أغلب اللغات من الصفر لا من الواحد. وهذا يربك المبتدئين في البداية.

  • متى تستعملها: حين يهمك الترتيب، أو حين تريد المرور على العناصر بالتتابع، كقائمة مهام أو سجل أحداث أو أسعار مرتبة.

  • أهم العمليات: إضافة عنصر في النهاية، وقراءة عنصر بموضعه، وحذف عنصر، والمرور على كل العناصر، وترتيبها، وأخذ جزء منها.

  • مزاياها: سهلة الفهم، وتحافظ على الترتيب، والوصول إلى عنصر بموضعه سريع في العادة.

  • عيوبها: البحث عن قيمة بعينها قد يتطلب فحص العناصر واحدًا واحدًا، وإدراج أو حذف عنصر في المنتصف قد يكلف نقل ما بعده.

  • تنبيه شائع: في كثير من اللغات، نسخ قائمة بإسنادها إلى متغير آخر لا ينشئ نسخة مستقلة، بل يشير المتغيران إلى القائمة نفسها. فتعديل أحدهما يظهر في الآخر. وانتبه لذلك واستعمل نسخًا صريحة عند الحاجة.

  • مثال: قائمة بأسماء ثلاثة منتجات مرتبة بحسب تاريخ الإضافة، تقرأ الأول والأخير وتضيف الجديد في النهاية.

القواميس: ربط المفاتيح بالقيم

القاموس، ويسمى الخريطة أو الكائن أو جدول التجزئة بحسب اللغة، هيكل يربط كل مفتاح بقيمة. وهو أحد أكثر الهياكل فائدة في البرمجة اليومية:

  • الفكرة: تبحث بالمفتاح فتحصل على القيمة مباشرة، مثل دليل الهاتف: تبحث بالاسم فتجد الرقم.

  • متى تستعمله: حين تريد الوصول إلى معلومة باسم أو معرّف لا بموضع، كبيانات مستخدم برقمه، أو إعدادات تطبيق، أو عدّ تكرار كل كلمة في نص.

  • أهم العمليات: إضافة أو تحديث زوج مفتاح وقيمة، وقراءة قيمة بمفتاحها، والتحقق من وجود مفتاح، وحذف زوج، والمرور على الأزواج.

  • ميزته الكبرى: البحث بالمفتاح سريع في العادة حتى لو كبر القاموس، وهذا يتفوق على البحث في قائمة طويلة.

  • قيود المفاتيح: المفتاح الواحد يظهر مرة واحدة، فإن أضفت مفتاحًا موجودًا استُبدلت قيمته. وبعض اللغات تشترط أن تكون المفاتيح من أنواع ثابتة.

  • الترتيب: الاعتماد على ترتيب العناصر في القاموس يختلف بين اللغات والإصدارات، فراجع توثيق لغتك قبل افتراض ترتيب محدد.

  • تداخل القواميس: يمكن أن تكون القيمة نفسها قاموسًا أو قائمة، فتبني بنى معقدة تشبه بيانات JSON التي ستقابلها في الواجهات البرمجية.

  • مثال: قاموس يربط رمز كل دولة باسمها، فتجيب عن «ما اسم الدولة صاحبة الرمز كذا؟» بخطوة واحدة.

المجموعات: عناصر فريدة بلا ترتيب

المجموعة هيكل يحتفظ بقيم فريدة لا تتكرر، ولا يهم ترتيبها. وهي أقل ظهورًا في الدروس الأولى لكنها حل أنيق لمشكلات معينة:

  • الفكرة: مثل مجموعة رياضية: العنصر إما موجود أو غير موجود، ولا يوجد مرتين.

  • متى تستعملها: لإزالة التكرار من قائمة، أو للتحقق السريع من وجود عنصر، أو للمقارنة بين مجموعتين.

  • عمليات المجموعات: الاتحاد (كل عناصر المجموعتين)، والتقاطع (المشترك بينهما)، والفرق (ما في الأولى وليس في الثانية). وهي تحل مسائل مثل «من حضر الدورتين؟» بسطر واحد.

  • سرعة الفحص: سؤال «هل هذا العنصر موجود؟» سريع في المجموعة بالمقارنة مع القائمة الطويلة.

  • عيوبها: لا تحفظ ترتيب الإدخال في أغلب الحالات، ولا تتيح الوصول بالموضع. فلا تصلح حين يهمك الترتيب أو التكرار.

  • تنبيه: كثير من اللغات تشترط أن تكون عناصر المجموعة من أنواع لا تتغير، فلا يمكن وضع قائمة قابلة للتعديل داخل مجموعة مباشرة.

  • مثال: تريد معرفة المدن الفريدة في طلبات المتجر، فتضيف مدينة كل طلب إلى مجموعة وتحصل على القائمة دون تكرار.

هياكل أخرى تستحق أن تعرفها

بعد الثلاثة السابقة، هناك هياكل أخرى تصادفها في المشاريع الأكبر. يكفي المبتدئ معرفة فكرتها وما تحله:

  • الصف (Tuple) والسجل: مجموعة قيم ثابتة لا تتغير أو سجل بحقول محددة. يناسب تجميع قيم مرتبطة، كإحداثيات نقطة.

  • المكدس (Stack): هيكل «آخر من يدخل أول من يخرج»، مثل كومة أطباق. يُستعمل في التراجع (Undo) وتتبع استدعاءات الدوال.

  • الطابور (Queue): «أول من يدخل أول من يخرج»، مثل طابور انتظار. يُستعمل في معالجة المهام بالترتيب كطلبات الطباعة.

  • القائمة المترابطة: عناصر يشير كل منها إلى التالي. يتعلمها الطلاب كثيرًا، لكن استعمالها المباشر أقل في البرامج اليومية بسبب ما توفره اللغات من بدائل.

  • الأشجار: هيكل هرمي، مثل نظام المجلدات أو بنية صفحة HTML. تفيد حين تكون البيانات متفرعة.

  • الرسوم البيانية (Graphs): عقد وروابط بينها، تمثل شبكات الطرق أو العلاقات الاجتماعية. وهي موضوع متقدم.

  • المعالجة بالأولوية (Heap): تتيح استخراج أصغر أو أكبر عنصر بسرعة، وتفيد في جدولة المهام.

  • لا تلزم حفظها كلها: كل لغة توفر معظمها جاهزًا، والأهم أن تعرف أنها موجودة لتبحث عنها حين تحتاج.

كيف تختار الهيكل المناسب لمشكلتك؟

القرار يعتمد على ما تفعله بالبيانات أكثر. وهذه أسئلة تساعدك على الاختيار في أغلب الحالات:

  • هل يهمني الترتيب؟ إن نعم فالقائمة، وإن لا فقد تناسبك المجموعة أو القاموس.

  • هل أصل إلى القيمة باسم أو معرّف؟ إن نعم فالقاموس غالبًا هو الأنسب بدل قائمة تبحث فيها.

  • هل يجب ألا يتكرر العنصر؟ إن نعم فالمجموعة تضمن ذلك دون عمل منك.

  • هل أبحث كثيرًا أم أضيف كثيرًا؟ الاستخدامات مختلفة، والتجربة والقياس يحسمان في الحالات الدقيقة.

  • ما حجم البيانات؟ مع بيانات صغيرة لا يهم الاختيار كثيرًا، فاختر الأوضح. وحين تكبر يصبح للسرعة وزن.

  • ما الأوضح لمن سيقرأ الكود؟ كثيرًا ما يكون الخيار الأوضح هو الصحيح، فلا تعقّد بلا داع.

  • جرّب وقِس: إن شككت فاكتب نسختين وقِس سرعتهما على بيانات تشبه الواقع بدل الاعتماد على التخمين.

  • مثال: تريد عد تكرار كل كلمة في نص. القاموس مناسب بوضوح: المفتاح الكلمة والقيمة عدد مرات ظهورها، والمرور على النص مرة واحدة يكفي.

أسئلة شائعة عن هياكل البيانات

هل أحتاج إلى دراسة هياكل البيانات المتقدمة كلها؟

ليس في البداية. أتقن القوائم والقواميس والمجموعات أولًا، وستغطي أغلب مشاريعك. وتعلم الباقي حين تدفعك إليه مسألة أو مقابلة عمل أو مجال معين.

ما الفرق بين المصفوفة والقائمة؟

يختلف المصطلح من لغة إلى أخرى، ففي بعضها المصفوفة بحجم ثابت وفي أخرى تتغير. راجع توثيق لغتك لمعرفة سلوكها الدقيق.

كيف أتدرب عليها؟

حل مسائل صغيرة تعتمد على كل هيكل: عد التكرار بقاموس، وإزالة المكرر بمجموعة، وعكس قائمة. ثم ابنِ مشروعًا صغيرًا كقائمة جهات اتصال تستعمل فيه أكثر من هيكل.


إرسال تعليق

0 تعليقات