الدرس الثاني (١)
انظر إلى الشكل: تبدأ هياكل البيانات من قسمين رئيسيين هما هياكل البيانات الأولية وهياكل البيانات غير الأولية. البيانات الأولية تضم الأعداد الصحيحة، والأرقام العشرية، والنصوص، والقيم المنطقية. أما هياكل البيانات غير الأولية فتتفرع إلى هياكل غير خطية مثل المخططات والأشجار، وهياكل خطية تضم القائمة المترابطة، والطابور، والمكدس، والقاموس، والصفوف، والمصفوفة، والقائمة. تخيل أنك ترتب كتباً في مكتبة، لو رميتها عشوائياً فلن تجد الكتاب المطلوب بسرعة، لكن لو رتبتها في أرفف محددة، فس تصل إليه خلال ثوانٍ معدودة. هذا بالضبط ما تفعله هياكل البيانات، فهي تنظم المعلومات داخل ذاكرة الحاسب لكي تسترجعها الخوارزميات بسرعة وكفاءة عالية دون إهدار للوقت أو الذاكرة، وهو ما يمثل الأساس في تدريب نماذج الذكاء الاصطناعي.
يقوم الدرس على فكرة تنظيم البيانات في هياكل محددة لتسهيل معالجتها واسترجاعها بكفاءة في أنظمة الذكاء الاصطناعي. وأهم ما في الدرس هو تفصيل هياكل البيانات إلى أولية وغير أولية، مع التركيز على هياكل البيانات الخطية وأهمها المكدس (Stack). يعمل المكدس وفق قاعدة آخر عنصر مضاف يخرج أولا، وله عمليتان رئيسيتان هما إضافة عنصر باستخدام دالة append وحذف عنصر باستخدام دالة pop. مثال سريع: لو أضفت الأرقام 1 ثم 21 ثم 32 ثم 45 إلى المكدس بهذا الترتيب، فإن العنصر الموجود عند القمة والذي سيخرج أولا عند تطبيق عملية الحذف هو الرقم 45 لأنه آخر ما دخل.
الفكرة الأساسية
تدور فكرة الدرس حول تنظيم البيانات بطريقة صحيحة ودقيقة لتمكين الخوارزميات من معالجتها بسرعة وكفاءة. البيانات غير المنظمة تعيق عمل نماذج الذكاء الاصطناعي وتمنعها من التعلم والتنبؤ، ولذلك تلعب هياكل البيانات دورا رئيسيا في تخزين وتنظيم البيانات داخل الذاكرة.
الشرح
تنقسم هياكل البيانات إلى تصنيفين رئيسيين: هياكل البيانات الأولية وتسمى البيانات الأولية أو الخام أو الأساسية، وهي التي تدعمها لغة البايथन بشكل مباشر مثل الأرقام الصحيحة والأرقام العشرية والسلاسل النصية والبيانات المنطقية. التصنيف الثاني هو هياكل البيانات غير الأولية وهي هياكل متخصصصة تخزن مجموعة من القيم يكتبها المبرمج ولا تعرف بلغة البايथन مباشرة. تنقسم هياكل البيانات غير الأولية إلى هياكل خطية متسلسلة وهياكل غير خطية. من أشهر الهياكل الخطية المكدس (Stack)، وهو يمثل مجموعة من العناصر مرتبة فوق بعضها وتعمل وفق قاعدة أن آخر عنصر مضاف هو أول عنصر يخرج، ويرمز لهذه القاعدة باختصار .
للتعامل مع المكدس توجد عمليتان أساسيتان هما إضافة عنصر وتسمى (Push) وتتم في لغة البايथन باستخدام دالة append لإضافة العنصر إلى نهاية القائمة، وحذف عنصر وتسمى (Pop) وتتم باستخدام دالة pop لحذف العنصر الأخير من القائمة. عندما تضيف عنصرا جديدا يرتفع مؤشر الأعلى (Top) بمقدار واحد، وعندما تحذف عنصرا ينخفض مؤشر الأعلى بمقدار واحد. انتبه لمشكلتين قد تحدثان: فيض المكدس (Stack Overflow) إذا حاولت إضافة عنصر والذاكرة ممتلئة، وغيض المكدس (Stack Underflow) إذا حاولت حذف عنصر والمكدس فارغ.
مثال محلول خطوة بخطوة
انظر إلى طريقة تطبيق العمليات على المكدس في لغة البايथन عبر مفكرة جوبيتر:
- أنشئ مكدسا يحتوي على مجموعة من الأرقام هكذا:
mystack = [1, 21, 32, 45]حيث الرقم 45 يمثل القمة. - لو كتبت أمر الحذف
print(myStack.pop())مرتين متتاليتين، فإن الحاسب سيحذف الرقم 45 أولا ثم يحذف الرقم 32 ثانيا، لتصبح القائمة بعد الحذف هكذا:[1, 21]. - لو أردت إضافة عنصر جديد وليكن الرقم 78 إلى المكدس باستخدام أمر الإضافة
myStack.append(78)، فإن الرقم 78 سيدخل ويستقر في النهاية ليصبح شكل المكدس النهائي هكذا:[1, 21, 78].
أخطاء شائعة
الخطأ الشائع هنا هو محاولة حذف عنصر من مكدس فارغ تماما، وهو ما يولد خطأ الفهرس المعروف بـ IndexError ويسبب مشكلة غيض المكدس (Stack Underflow). لتجنب هذا الخطأ، يجب عليك دائما التحقق من وجود عناصر في المكدس قبل محاولة حذف أي عنصر منه.
سؤالان للتدريب مع الإجابة
السؤال الأول: لديك مكدس يحتوي على العناصر التالية بالترتيب من القاعدة إلى القمة: [10, 20, 30]، فما هو العنصر الذي سيتم حذفه أولا عند تطبيق دالة الحذف (Pop)؟
الإجابة: سيتم حذف الرقم 30 أولا لأنه يمثل العنصر الموجود في قمة المكدس.
السؤال الثاني: ما هي الدالة المستخدمة في لغة البايथन لإضافة عنصر جديد إلى مكدس ممثل باستخدام القوائم؟ الإجابة: تستخدم دالة append.