ما معنى ADT ونوع البيانات المجرد (Abstract Data Type) في هياكل البيانات؟

شروحات تقنية

اختصار ADT يعني Abstract Data Type، أي «نوع البيانات المجرَّد». وعندما تصادف عبارة مثل «ADT: see abstract data type» في مسرد مصطلحات أو كتاب خوارزميات، فهي مجرد إحالة تقول لك إنّ ADT هو الاختصار، والمعنى الكامل هو Abstract Data Type. أمّا المفهوم نفسه فهو ببساطة: نموذج منطقي يصف ما تفعله البنية (القيم التي تخزّنها والعمليات المسموح بها عليها) دون أن يحدّد كيف تُنفَّذ داخليًا. أي أنه يجيب عن سؤال «ماذا؟» ويترك سؤال «كيف؟» للتطبيق الفعلي.

لتقريب الفكرة: تخيّل جهاز التحكم عن بُعد في التلفاز. أنت تعرف الأزرار وما تفعله (تشغيل، رفع الصوت، تغيير القناة)، لكنك لا تحتاج إطلاقًا لمعرفة الدوائر الإلكترونية بالداخل. هذه هي فلسفة ADT: واجهة واضحة تخفي التعقيد.

الفرق الجوهري بين ADT وهيكل البيانات

هذه هي النقطة التي يخلط فيها معظم المبتدئين، وهي جوهر الموضوع:

  • نوع البيانات المجرد (ADT) هو المواصفة أو العقد: قائمة بالعمليات وسلوكها المتوقّع. مثال: «المكدس Stack يدعم push وpop وpeek، وآخر عنصر يدخل هو أول عنصر يخرج».
  • هيكل البيانات (Data Structure) هو التنفيذ الملموس في الذاكرة الذي يحقّق هذا العقد. مثال: يمكن بناء المكدس نفسه فوق مصفوفة (Array) أو فوق قائمة مترابطة (Linked List)، والنتيجة تعمل بالطريقة ذاتها من وجهة نظر المستخدم.

بعبارة أخرى: ADT هو الفكرة، وهيكل البيانات هو المادة التي تُجسّد الفكرة. ويمكن للفكرة الواحدة أن تُجسَّد بأكثر من طريقة، ولكل طريقة أداؤها المختلف.

الوجهنوع البيانات المجرد (ADT)هيكل البيانات
يجيب عن سؤالماذا يمكن أن نفعل؟كيف يُخزَّن ويُنفَّذ؟
المستوىمنطقي / رياضيفيزيائي / برمجي
مثالStack, Queue, List, Mapمصفوفة، قائمة مترابطة، جدول تجزئة
يهتم بالأداء (Big-O)؟لا مباشرةنعم، يحدّده التنفيذ
قابل للاستبدال؟هو الواجهة الثابتةنعم، يمكن تبديله دون كسر الكود

أشهر أنواع البيانات المجرَّدة

القائمة (List): تسلسل مرتّب من العناصر يسمح بالإضافة والحذف والقراءة بأي موضع. تُنفَّذ غالبًا كمصفوفة ديناميكية أو قائمة مترابطة.

المكدس (Stack): يعمل بمبدأ «آخر داخل، أول خارج» (LIFO). عملياته الأساسية push للإضافة وpop للإزالة من القمة وpeek لمعاينة القمة. يُستخدم في تتبّع استدعاء الدوال، وزر «تراجع» (Undo)، وتقييم المعادلات الرياضية.

الطابور (Queue): يعمل بمبدأ «أول داخل، أول خارج» (FIFO). العنصر يدخل من الخلف (enqueue) ويخرج من الأمام (dequeue). مثالي لطوابير الطباعة وجدولة المهام ومعالجة الطلبات بالترتيب.

الخريطة/القاموس (Map/Dictionary): يربط مفتاحًا بقيمة، مثل dict في بايثون أو HashMap في جافا. يُنفَّذ عادةً بجدول تجزئة أو شجرة متوازنة.

المجموعة (Set): تخزّن عناصر فريدة دون تكرار، مع عمليات الاتحاد والتقاطع والفرق.

لماذا يهمّك هذا المفهوم عمليًا؟

في اللغات الحديثة، تظهر أنواع البيانات المجرَّدة على هيئة واجهات (Interfaces) أو أصناف مجرَّدة: مثل interface List في جافا، أو Protocol وفئات abc في بايثون، أو Traits في راست. عندما تبرمج على مستوى الواجهة بدل التنفيذ، تكسب:

  1. مرونة الاستبدال: يمكنك تغيير ArrayList إلى LinkedList دون تعديل بقية الكود، لأن العقد لم يتغيّر.
  2. كود أنظف وأسهل صيانة: كل جزء يعرف ما يستطيع فعله فقط، لا التفاصيل الداخلية.
  3. قرارات أداء واعية: بما أنّ ADT يفصل الفكرة عن التنفيذ، يمكنك اختيار الهيكل الأنسب لحالتك (سرعة القراءة مقابل سرعة الإدراج مثلًا).

نصيحة عملية وخطأ شائع

الخطأ الأكثر تكرارًا هو الاعتقاد بأنّ «المكدس = مصفوفة» أو «الطابور = قائمة مترابطة». هذا غير صحيح. المكدس مفهوم، والمصفوفة مجرد إحدى طرق تنفيذه. النصيحة: عند حلّ مسألة برمجية، فكّر أولًا في ADT الذي يصف سلوك بياناتك (هل أحتاج LIFO؟ FIFO؟ بحثًا بالمفتاح؟)، ثم اختر هيكل البيانات الذي يعطيك أفضل تعقيد زمني لتلك العمليات تحديدًا. هذا الترتيب في التفكير هو ما يميّز حلًّا هندسيًا سليمًا عن حلٍّ عشوائي.

الأسئلة الشائعة

هل ADT مرتبط بلغة برمجة معيّنة؟ لا. المفهوم مستقلّ عن اللغة تمامًا، لكن معظم اللغات توفّر أدوات لتجسيده مثل الواجهات والأصناف المجرَّدة. الفكرة نفسها تنطبق على جافا وبايثون و++C وراست وغيرها.

ما الفرق بين ADT والنوع البدائي مثل int؟ النوع البدائي (int, char) مبنيّ داخل اللغة وبسيط، بينما ADT نموذج أعلى مستوى يعرّفه المبرمج أو المكتبة، ويصف عمليات مركّبة مثل الإضافة والحذف والبحث على مجموعة من القيم.

هل يحدّد ADT سرعة العمليات (Big-O)؟ لا يحدّدها مباشرة؛ فالتعقيد الزمني يعتمد على التنفيذ المختار. مثلًا عملية البحث في «قائمة» قد تكون بطيئة في القائمة المترابطة وسريعة إن نُفِّذت فوق بنية مفهرسة. لذلك يُختار الهيكل حسب العمليات الأكثر تكرارًا في تطبيقك.

هل المكدس والطابور هياكل بيانات أم أنواع مجرَّدة؟ هما نوعان مجرَّدان (ADTs) لأنهما يصفان سلوكًا، ويُنفَّذان بهياكل بيانات مثل المصفوفات أو القوائم المترابطة. من الدقّة أن نقول «المكدس نوع بيانات مجرد يُنفَّذ عبر هيكل بيانات».